TCP/IP Winsock程式設計要點(轉)

heying1229發表於2007-07-28
1、快速通訊

  Winsock的Nagle演算法將降低小資料包的傳送速度,而系統預設是使用Nagle演算法,使用

int setsockopt(

SOCKET s,

int level,

int optname,

const char FAR *optval,

int optlen

);函式關閉它

  例子:

SOCKET sConnect;

sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

int bNodelay = 1;

int err;

err = setsockopt(

sConnect,

IPPROTO_TCP,

TCP_NODELAY,

(char *)&bNodelay,

sizoeof(bNodelay));//不採用延時演算法

if (err != NO_ERROR)

TRACE ("setsockopt failed for some reason ");;

  2、SOCKET的SegMentSize和收發緩衝

  TCPSegMentSize是傳送接受時單個資料包的最大長度,系統預設為1460,收發緩衝大小為8192。

  在SOCK_STREAM方式下,如果單次傳送資料超過1460,系統將分成多個資料包傳送,在對方接受到的將是一個資料流,應用程式需要增加斷幀的判斷。當然可以採用修改登錄檔的方式改變1460的大小,但MicrcoSoft認為1460是最佳效率的引數,不建議修改。

  在工控系統中,建議關閉Nagle演算法,每次傳送資料小於1460個位元組(推薦1400),這樣每次傳送的是一個完整的資料包,減少對方對資料流的斷幀處理。

  3、同步方式中減少斷網時connect函式的阻塞時間

  同步方式中的斷網時connect的阻塞時間為20秒左右,可採用gethostbyaddr事先判斷到服務主機的路徑是否是通的,或者先ping一下對方主機的IP地址。

  A、採用gethostbyaddr阻塞時間不管成功與否為4秒左右。

  例子:

LONG lPort=3024;

struct sockaddr_in ServerHostAddr;//服務主機地址

ServerHostAddr.sin_family=AF_INET;

ServerHostAddr.sin_port=::htons(u_short(lPort));

ServerHostAddr.sin_addr.s_addr=::inet_addr("192.168.1.3");

HOSTENT* pResult=gethostbyaddr((const char *) &

(ServerHostAddr.sin_addr.s_addr),4,AF_INET);

if(NULL==pResult)

{

int nErrorCode=WSAGetLastError();

TRACE("gethostbyaddr errorcode=%d",nErrorCode);

}

else

{

TRACE("gethostbyaddr %s ",pResult->h_name);;

}

  B、採用PING方式時間約2秒左右

  暫略[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10172717/viewspace-928881/,如需轉載,請註明出處,否則將追究法律責任。

相關文章