我在Unix OS上使用C语言中的套接字编程实现了客户端服务器。我在客户端使用了非阻塞套接字。我想实现双向沟通。但它只能以一种方式工作,即客户端可以在服务器上读写数据,但服务器无法在客户端读取或写入数据。
客户端
nread = recv(sock, ptr, nleft, MSG_DONTWAIT))
send(sock, ptr, nleft, 0))
服务器
recv(sock, ptr, nleft, MSG_DONTWAIT))
SockWrite(sock, Message, dataLength)
服务器在阅读时始终面临问题。谁能解释我为什么以及如何摆脱这个?
答案 0 :(得分:1)
等待套接字准备好使用select()调用进行读取或写入。
答案 1 :(得分:0)
recv的返回码是什么?您是否将recv套接字设置为非阻塞?在这种情况下,你可能会看到EAGAIN,你需要选择()等,或者回到阻止。我不建议忽略系统调用的返回值。
答案 2 :(得分:0)
代码示例
static void SetNonBlock(const int nSock, bool bNonBlock)
{
int nFlags = fcntl(nSock, F_GETFL, 0);
if (bNonBlock) {
nFlags |= O_NONBLOCK;
} else {
nFlags &= ~O_NONBLOCK;
}
fcntl(nSock, F_SETFL, nFlags);
}
...
SetNonBlock(sock, true);
...
int code = recv(sock, buf, len_expected, 0);
if(code > 0) {
here got all or partial data
} else if(code < 0) {
if((errno != EAGAIN) && (errno != EINPROGRESS) ) {
here handle errors
}
otherwise may try again
} else if(0 == code) {
FIN received, close the socket
}