我最近在学习 Unix 网络编程。学了5.1~5.3之后写了一些玩具代码。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#define SERV_PORT 9877
#define MAXLINE 4096
#define LISTENQ 1024
void str_echo(int sockfd)
{
puts("str_echo");
size_t n;
char buf[MAXLINE];
int writebytes;
again:
while((n == read(sockfd, buf, MAXLINE)) > 0)
writebytes = write(sockfd, buf, n);
printf("writebytes=%d n=%d\n", writebytes, (int)n);
if(n < 0 && errno == EINTR)
goto again;
else if(n < 0)
perror("str_echo"), exit(1);
}
int main()
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
listen(listenfd, LISTENQ);
for(;;){
puts("in loop");
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);
/*char ipa[100];
printf("ip address=%s\n", inet_ntop(AF_INET, &cliaddr.sin_addr, ipa, 50));*/
if((childpid = fork()) == 0){
printf("connfd=%d\n",connfd);
puts("in if");
close(listenfd);
str_echo(connfd);
exit(0);
}
close(connfd);
}
}
当我使用 telnet 测试代码时:
telnet 127.0.0.1 9877
我输入'nihao',输出是:
Trying 127.0.0.1...
in loop
Connected to 127.0.0.1.
Escape character is '^]'.
connfd=4
in if
str_echo
nihao
writebytes=0 n=0
Connection closed by foreign host.
请告诉我这有什么问题。我正在尝试添加一些 printf 进行调试。搜索 read-returning-0 的最常见原因是客户端关闭连接。但是 telnet 在读取之前没有关闭连接。为什么读取返回0?如何修改我的代码来解决这个问题?我的操作系统是 Ubuntu 16.04。
有一个错字str_echo
:
while((n == read(sockfd, buf, MAXLINE)) > 0)
==
是一个比较。你想做一个作业。改成:
while((n = read(sockfd, buf, MAXLINE)) > 0)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句