read函数返回立即返回0

              ❤️强烈推荐人工智能学习网站❤️

                     最近在测试一个网络程序的时候,每次调用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。
 


 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值