我最近正在学习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进行调试。 搜索读取返回0的最常见原因是客户端关闭连接。但telnet在阅读之前没有关闭连接。 为什么读取返回0? 如何修改代码以解决此问题? 我的操作系统是Ubuntu 16.04。
答案 0 :(得分:1)
str_echo
中有一个拼写错误:
while((n == read(sockfd, buf, MAXLINE)) > 0)
==
是一个比较。你想做一个任务。改为:
while((n = read(sockfd, buf, MAXLINE)) > 0)