歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux網絡 >> Linux網絡編程的注意事項

Linux網絡編程的注意事項

日期:2017/3/1 10:05:16   编辑:Linux網絡

1、返回值判斷

示例:

int num = recv(s,buf, MAX,0);

能夠從套接字讀多少數據不是api參數能夠控制的,只能通過返回來確認。

再有就是有些api調用是次序依賴的,前面的錯了,後面的也會錯。

所以返回值的判斷是必須的。

2、端口復用

一般server異常退出後,端口沒有被系統馬上釋放,如何才能立即使用端口呢?

on = 1;

ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );

3、數據同步

server read/write(recv/send、recvfrom/sendto)<----->client read/write(recv/send、recvfrom/sendto)

如果收發端的速度不一致,常常會出現發送多次接收一次或是發送一次接收多次的情況。

解決方案:

A、緩存接收,加格式頭來解析數據

使用循環隊列,一邊接收,一邊按設定格式解析。

B、應答接收

接收端先請求,發送端發一次數據,接收端接收到格式指定的數據後,再發請求,發送再發送數據,依次類推。

4、發送數據包大小

A、tcp

如果write(/send、sendto)的緩存過大,協議層就會拆包發送,如果存在丟包現象(TCP應答機制會重發保證小包發送出去),實時大數據發送的時候,系統性能就會降低。

B、udp

如果write(/send、sendto)的緩存過大,協議層就會拆包發送,如果存在丟包現象(UDP發包後就不管),實時大數據發送的時候,接收端接收到數據就會不完整。

C、tcp及udp

如果write(/send、sendto)的緩存過小,譬如每次收發一個字節,大量協議內容就傳遞一個字節,通訊效能也就低。

解決方案:

參考內核拆包的最大容量設置及網絡吞吐能力,如果應用層數據過大,就需要應用層拆包發送,保證協議層不用拆包。

5、字節序

兩端主機的字節序不一致,如果不作邏輯約定,就會造成接收數據解析錯誤。

解決方案:

約定字節序

6、緩存字節對齊

如果發送的數據不是字節對齊的,就會出現垃圾數據,浪費流量。

7、主機異常退出

如果server和client正在進行數據交換時候,一端異常退出,就會造成另一端linux系統發出“Pipe Broken”信號,不忽略該信號,就會造成程序被終止。

解決方案:

send/recv、sendto/recvfrom的標志參數設置成MSG_NOSIGNAL,

使用read/write,則先忽略SIGPIPE信號。

Copyright © Linux教程網 All Rights Reserved