[英]Read from socket freeze
從服務器上的客戶端讀取數據時出現問題。 在讀取所有數據並等待更多數據之后,read()函數將始終凍結(阻止),這對我來說是不希望的。
服務器程序:
soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = INADDR_ANY;
bind(soc, (struct sockaddr*) &sin, sizeof(sin));
if (listen(soc, MAX))
return;
int socc; // socket for clinet
while (1) {
if ((socc = accept(soc, (struct sockaddr *) &sin, sinlen)) < 0)
break;
while ((result = read(socc, pointer, SIZE)) > 0) {
// after the data are readed, read function will block
}
// do some stuff and write reply to client => will never done
}
客戶程序:
...
soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
struct sockaddr_in socketAddr;
socketAddr.sin_family = AF_INET;
socketAddr.sin_port = htons(port);
memcpy(&(socketAddr.sin_addr), host->h_addr, host->h_length);
if (connect(soc, (sockaddr *)&socketAddr, sizeof(socketAddr)) == -1)
return;
if (write(soc, req.c_str(), strlen(req.c_str())) < 0)
return;
主要問題是我不知道客戶端將向服務器發送多少數據,因此服務器應從套接字讀取所有數據,並且在什么都沒發生后,離開讀取周期。 但是服務器讀取了整個消息(例如30字節),然后等待更多(但不會再收到)。 套接字仍處於打開狀態,因為客戶端正在等待服務器的答復。
您將需要使套接字無阻塞。 在這種情況下,如果沒有要讀取的特定錯誤,讀取將立即退出。
如前所述,使用非阻塞或將RCV_TIMEOUT添加到套接字。
struct timeval tv;
tv.tv_sec = 30; /* 30 Secs Timeout */
setsockopt(sockid, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.