Unix网络编程5-10节问题解决
在学习Unix网络编程时,对照着例程写了个回射服务器。编译没有任何问题,但是客户端就是无法正确接收到服务器端返回的数据。
通过调试之后发现。问题点在于
if(connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen)< 0)
调试到这里时发现,connfd返回0,网上查到好多说是因为stdin被关闭了,但是检查了一遍程序后发现没有出现这种情况。
后来猛然发现,if语句中少了个括号,把括号加上就好了
if((connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen))< 0)
connfd为0的原因是:accept的返回值先与后面的<0进行判断,为假,于是赋值给了connfd,也就让connfd变成了0。
对于这节主要讲的一点是,accept在被信号中断时的错误解决问题。
if((connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen))< 0){
if(errno == EINTR)
continue;
}
当编写捕获信号的函数时,要正确认识被中断的系统调用被处理他们
如果没有对EINTR错误的处理,阻塞在accept上的系统调用会被信号中断返回EINTR错误并且中止。