歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 套接字網絡編程筆記

套接字網絡編程筆記

日期:2017/3/1 10:19:09   编辑:Linux編程

1.調用int send( __in SOCKET s, __in const char* buf, __in int len, __in int flags); 發出的數據包,在傳送過程中,雖然順序不會把打亂,但可能會拆分成多個包,這樣,只調用一次int recv( __in SOCKET s, __out char* buf, __in int len, __in int flags); 可能不能被完整地接收。

解決的方法是,定義TCP之上的協議,即應用層協議,指示數據包長度。最簡單的實現為:

  1. void SendFn(SOCKET s, char* data, int len)
  2. {
  3. char* buff = (char*)malloc(sizeof(int)+len);
  4. //填充報文頭
  5. int* pLen = (int*)buff;
  6. *pLen = len;
  7. //填充有效數據
  8. memcpy(buff+sizeof(int), data, len);
  9. send(s, buff, sizeof(int)+len, 0);
  10. }
  11. //完整接收指定長度數據包
  12. void RecvFnS(SOCKET s, char* buff, int len)
  13. {
  14. int done = 0;
  15. done = recv(s, buff, len, 0);
  16. while ( done < len )
  17. done += recv(s, buff+done, len, 0);
  18. }
  19. void RecvFn(SOCKET s)
  20. {
  21. int len;
  22. //接收報文頭
  23. RecvFnS(s, (char*)&len, sizeof(int));
  24. //接收有效數據
  25. if ( len > 0 )
  26. {
  27. char* buff = (char*)malloc(len);
  28. RecvFnS(s, buff, len);
  29. }
  30. }

2.TCP通信時,服務器用SOCKET accept( __in SOCKET s, __out struct sockaddr* addr, __inout int* addrlen); 創建的套接字共同占用一個端口,即服務器監聽端口。

為什麼要這麼做:客服端套接字指定通信對方的端口就是監聽端口,沒有理由找一個使用其它端口的套接字跟它連接。

為什麼能這麼做:TCP報文中,包含源端口,與目標端口,再加上IP層的源IP地址及目標IP地址,這四個信息,就是運輸層多路分解中,所需要的四元組,意思是可以唯一確定一個TCP連接。當從IP層,解包數據後,就可以根據四元組,找到這些數據的目標TCP連接。這點跟UDP連接是有區別的,因為UDP多路分解時只使用目標IP地址及目標端口,所以,只要目標IP為本機IP,目標端口為監聽端口的,UDP連接都會定向到一個UPD連接。這意味,UDP是一個一對多的連接(確切地說UPD不能叫連接)。

Copyright © Linux教程網 All Rights Reserved