專案中使用原有的網路傳送**進行資料傳輸,發現總是發不過去,或者發過去一部分,非常納悶。
經過仔細排查,是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的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...