❤️强烈推荐人工智能学习网站❤️
最近在测试一个网络程序的时候,每次调用read函数返回立即返回0,read是阻塞函数,没有读到数据竟然立即返回0,有些奇怪。想了一下,和tcp的四次挥手有关,看代码。
服务端:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#define MAXLINE 4096
int main()
{
int listenfd,acceptfd,n;
socklen_t clilen;
char recvbuf[30]={0};
struct sockaddr_in cliaddr,servaddr;
listenfd=socket(AF_INET,SOCK_STREAM,0);
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8888);
servaddr.sin_addr.s_addr = INADDR_ANY;
bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in));
listen(listenfd,5);
clilen=sizeof(cliaddr);
acceptfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);
while(1)
{
sleep(1);
printf("test\n");
memset(recvbuf,0,sizeof(recvbuf));
n=recv(acceptfd,recvbuf,sizeof(recvbuf)-1,0);
printf("recvbuf=%s,n=%d\n",recvbuf,n);
}
getchar();
close(listenfd);
return 0;
}
客户端:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <netinet/tcp.h>
#define MAXLINE 4096
int main()
{
int sockfd;
struct sockaddr_in servaddr;
char sendbuf[66495]="111111111";
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8888);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
printf("ret=%d\n",ret);
getchar();
close(sockfd);
return 0;
}
makefile:
all:server client
server.o:server.cpp
g++ -c server.cpp
client.o:client.cpp
g++ -c client.cpp
server:server.o
g++ -o server server.o
client:client.o
g++ -o client client.o
clean:
rm -f server client *.o
先启动服务端,再启动客户端,然后再关掉客户端,看打印。
[mapan@localhost test]$
[mapan@localhost test]$ ./server
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
test
recvbuf=,n=0
服务端的read函数理解返回,且返回值为0。其原因是,客户端关掉进程后发送FIN到服务端,然后系统给read函数发信号,告知read函数无数据,于是read函数马上返回。随后服务端每次调用read函数时都会收到系统发的这个信号,所以立即返回0。