[英]read() is not blocking in socket programming
我有一台服务器,每隔5秒就会向客户端发送一次数据。 我希望客户端阻止read()直到服务器发送一些数据然后打印它。 我知道read()默认是阻塞的。 我的问题是我的客户端没有阻塞read()。 这很奇怪,这似乎不是一个正常的问题。
我的代码在无限循环中打印“Nothing come back”。 我在linux机器上,用c编程。 我的代码片段如下。 请指教。
while(1)
{
n = read(sockfd, recvline, MAXLINE);
if ( n > 0)
{
recvline[n] = 0;
if (fputs(recvline, stdout) == EOF)
printf("fputs error");
}
else if(n == 0)
printf("Nothing came back");
else if (n < 0)
printf("read error");
}
return;
可能有几个原因,在不同的地方有几个例外:
检查您创建的套接字:
sockfd=socket(AF_INET,SOCK_STREAM,0); if (sockfd==-1) { perror("Create socket"); }
您还可以在使用前明确启用阻止模式:
// Set the socket I/O mode: In this case FIONBIO // enables or disables the blocking mode for the // socket based on the numerical value of iMode. // If iMode = 0, blocking is enabled; // If iMode != 0, non-blocking mode is enabled. ioctl(sockfd, FIONBIO, &iMode);
或者您可以使用setsockopt
如下:
struct timeval t; t.tv_sec = 0; tv_usec = 0; setsockopt( sockfd, // Socket descriptor SOL_SOCKET, // To manipulate options at the sockets API level SO_RCVTIMEO,// Specify the receiving or sending timeouts const void *(&t), // option values sizeof(t) );
检查读取函数调用(错误原因)
n = read(sockfd, recvline, MAXLINE); if(n < 0){ perror("Read Error:"); }
还要检查服务器代码 !:
可能您的服务器发送一些空白(不可打印,空,输入)章程。 而你却没有意识到这一点。 服务器代码也是错误的。
或者您的服务器在客户端可以读取之前终止 。
还有一件有趣的事情 ,试着去理解:
当您在服务器上调用N
write()
,不需要在另一侧调用Nread()
。
Greg Hewgill已经写了一个评论:EOF(即显式停止写入,通过close()
或者shutdown()
)将通过recv()
返回0传递给接收方。所以如果你得到0,你知道没有任何数据,你可以终止读取循环。
如果您启用了非阻塞且没有数据,则将获得-1
并将errno
设置为EAGAIN
或EWOULDBLOCK
。
MAXLINE的价值是什么?
如果值为0,则它也将返回0。 否则,正如Grijesh Chauhan所提到的那样,将其明确地设置为阻止。
或者,您也可以考虑使用recv(),其中可以指定阻塞和非阻塞。 它有选项MSG_WAITALL,它将阻塞所有字节到达。
n = recv(sockfd, recvline, MAXLINE, MSG_WAITALL);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.