客戶端報告了一個我無法理解的錯誤。基於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