簡體   English   中英

從套接字凍結讀取

[英]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字節),然后等待更多(但不會再收到)。 套接字仍處於打開狀態,因為客戶端正在等待服務器的答復。

您將需要使套接字無阻塞。 在這種情況下,如果沒有要讀取的特定錯誤,讀取將立即退出。

看看C- Unix套接字-非阻塞讀取

如前所述,使用非阻塞或將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM