Linux下非阻塞Socket傳送錯誤返回

2021-06-05 23:27:42 字數 646 閱讀 2164

專案中使用原有的網路傳送**進行資料傳輸,發現總是發不過去,或者發過去一部分,非常納悶。

經過仔細排查,是socket的send函式呼叫結果處理不正確造成的。

原有**:

int senddata( char *data,int length )

outputdebugstring("send data error\r\n");

return ret;

} else

}return length;

}

上面**在send返回後判斷返回值,並且檢視errno。

我並不知道einprogress是什麼意思,但是在網上查了資料也沒有發現有send完去判斷errno是einprogress的**。

最後發現還是errno判斷有錯誤。該**成

int senddata( char *data,int length )

if (errno == econnreset)

return ret;

} else

}return length;

}

測試後發現,沒有出現前述問題了,在解決問題的同時,學到了一些socket方面的東西。

Linux下socket阻塞模式與非阻塞模式

1 阻塞模式與非阻塞模式下recv的返回值各代表什麼意思?有沒有區別?就我目前了解阻塞與非阻塞recv返回值沒有區分,都是 0 出錯,0 連線關閉,0接收到資料大小,特別 返回值 0時並且 errno eintr errno ewouldblock errno eagain 的情況下認為連線是正常的...

socket阻塞與非阻塞

何為阻塞?在以上過程中若連線還沒到來,那麼接受阻塞,程式執行到這裡不得不掛起,cpu轉而執行其他執行緒。在以上過程中若資料還沒準備好,請閱讀會一樣也會阻塞。阻塞式網路io的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些cpu時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...

轉阻塞socket和非阻塞socket

讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...