客户端报告了一个我无法理解的错误。基于TCP的客户端连接到从其接收数据的服务器,很少发送任何内容。通常一切正常,但一旦在一个蓝色的月亮像这样的情况发生:tcp套接字读取调用如何不能返回
- 服务器发送一些数据
- 客户端接收数据
- 客户端处理数据
- ...和同时服务器发送更多的数据
- 客户端处理完
- 客户端尝试读取插槽
- 客户永远挂着数据在处理
- 服务器之后的第一个read()语句关闭连接
- 客户仍然挂起
这里是如何的TCP连接建立(删除所有日志,返回支票等)
ret = inet_pton(AF_INET, conn->address, &addr.sin_addr);
addr.sin_port = htons(conn->port); /* Server port */
addr.sin_family = AF_INET;
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock, (struct sockaddr *) &addr, sizeof(addr));
这里是读包装:
int32_t _readn (int fd, uint8_t *vptr, int32_t n)
{
int32_t nleft;
int32_t nread;
uint8_t* ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ((nread = read (fd, ptr, nleft)) < 0) {
if (errno == EINTR) {
nread = 0;
} else {
return E_NETWORK_ERROR;
}
} else if (nread == 0) {
break;
}
nleft -= nread;
ptr += nread;
}
return (n-nleft);
}
是否有可能即使在连接关闭之后,读取调用永远都会被阻止?
在我的包装中有没有一些棘手的错误,我没有注意到可能会导致这种情况?我应该为连接上的套接字设置一些标志吗?
有,为什么不使用它无阻塞,把一个理由像fd上的'select'而不是? – Jite 2013-02-27 13:05:47
不,没有。这样做可能是一个解决方案。还有其他一些方法我可以想到这将是一个很好的解决方法。但我想知道问题的根源。 – Dariusz 2013-02-27 13:20:50