希望有人能幫助我。我想實現某種超時,如果我的套接字無法在一定的時間內接收數據...我在網上查找方式,但我看過的例子沒有他們的recv( )在像我這樣的while循環中,他們通常只是接收等待的整個緩衝區。也許我的效率不高,有人可能會指出我在接收所有數據方面有更好的方向。帶超時的C/C++ recv()
要接收的字符串不是固定長度,這就是爲什麼我一次收到1個字符串,因爲我不知道字符串有多大。正如你可以看到我的recv()將接收數據,直到它找到文本字符結尾()。我發現select()的例子會在調用receive之前使用select,但是我應該如何爲while循環的每一個循環執行該操作?或者甚至在我輸入while循環之前調用select()?
無論如何,任何幫助表示讚賞。
string recv_data(int socket){
bool endfound = false;
char temp[1];
string recvstring ;
while(endfound == false)//receives 1 character at a time until ETX(\x03)character is found
{
if(recv(socket,temp,sizeof(temp),0)<0)
{
perror("error in recv data");
}
if(memchr(temp,'\x03',1) != NULL)
{
endfound = true;
}
recvstring += temp;
temp[0] = 0;
}
return formatting(recvstring);
}
有了這個:'recvstring + = temp;'你的意思是'recvstring + = temp [0];'? (否則它會去查找空終止符) – Galik
如果您的平臺支持它,您可以使用SO_RCVTIMEO,但我同意您的看法,即整個設計是錯誤的。網絡代碼中不需要一次讀取一個字節。 – EJP
我剛開始感覺到,因爲我不知道輸入字符串的大小,所以最好在收到字符串之前找到結尾。現在想想看,我可能會很好,只需將我的char聲明爲一個大的東西,然後搜索結尾的文本字符以添加一個空終止符。 – Zack