亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

用C語言進行最基本的socket編程

2020-05-23 14:12:50
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了C語言下socket編程的基本知識講解,包括最基本的客戶端發送及服務器端接受數據的實現,需要的朋友可以參考下

什么是socket

你經常聽到人們談論著 “socket”,或許你還不知道它的確切含義?,F在讓我告訴你:它是使用 標準Unix 文件描述符 (file descriptor) 和其它程序通訊的方式。什么?你也許聽到一些Unix高手(hacker)這樣說過:“呀,Unix中的一切就是文件!”那個家伙也許正在說到一個事實:Unix 程序在執行任何形式的 I/O 的時候,程序是在讀或者寫一個文件描述符。一個文件描述符只是一個和打開的文件相關聯的整數。但是(注意后面的話),這個文件可能是一個網絡連接,FIFO,管道,終端,磁盤上的文件或者什么其它的東西。Unix 中所有的東西就是文件!所以,你想和Internet上別的程序通訊的時候,你將要使用到文件描述符。你必須理解剛才的話?,F在你腦海中或許冒出這樣的念頭:“那么我從哪里得到網絡通訊的文件描述符呢?”,這個問題無論如何我都要回答:你利用系統調用 socket(),它返回套接字描述符 (socket descriptor),然后你再通過它來進行send() 和 recv()調用。“但是...”,你可能有很大的疑惑,“如果它是個文件描述符,那么為什 么不用一般調用read()和write()來進行套接字通訊?”簡單的答案是:“你可以使用!”。詳細的答案是:“你可以,但是使用send()和recv()讓你更好的控制數據傳輸。”存在這樣一個情況:在我們的世界上,有很多種套接字。有DARPA Internet 地址 (Internet 套接字),本地節點的路徑名 (Unix套接字),CCITT X.25地址 (你可以將X.25 套接字完全忽略)。也許在你的Unix 機器上還有其它的。我們在這里只講第一種:Internet 套接字。

Internet 套接字的兩種類型 :

什么意思?有兩種類型的Internet 套接字?是的。不,我在撒謊。其實還有很多,但是我可不想嚇著你。我們這里只講兩種。除了這些, 我打算另外介紹的 "Raw Sockets" 也是非常強大的,很值得查閱。

那么這兩種類型是什么呢?一種是"Stream Sockets"(流格式),另外一種是"Datagram Sockets"(數據包格式)。我們以后談到它們的時候也會用到"SOCK_STREAM" 和 "SOCK_DGRAM"。數據報套接字有時也叫“無連接套接字”(如果你確實要連接的時候可以用connect()。) 流式套接字是可靠的雙向通訊的數據流。如果你向套接字按順序輸出“1,2”,那么它們將按順序“1,2”到達另一邊。它們是無錯誤的傳遞的,有自己的錯誤控制,在此不討論。

有什么在使用流式套接字?你可能聽說過 telnet,不是嗎?它就使用流式套接字。你需要你所輸入的字符按順序到達,不是嗎?同樣,WWW瀏覽器使用的 HTTP 協議也使用它們來下載頁面。實際上,當你通過端口80 telnet 到一個 WWW 站點,然后輸入 “GET pagename” 的時候,你也可以得到 HTML 的內容。為什么流式套接字可以達到高質量的數據傳輸?這是因為它使用了“傳輸控制協議 (The Transmission Control Protocol)”,也叫 “TCP” (請參考 RFC-793 獲得詳細資料。)TCP 控制你的數據按順序到達并且沒有錯

誤。你也許聽到 “TCP” 是因為聽到過 “TCP/IP”。這里的 IP 是指“Internet 協議”(請參考 RFC-791。) IP 只是處理Internet 路由而已。

那么數據報套接字呢?為什么它叫無連接呢?為什么它是不可靠的呢?有這樣的一些事實:如果你發送一個數據報,它可能會到達,它可能次序顛倒了。如果它到達,那么在這個包的內部是無錯誤的。數據報也使用 IP 作路由,但是它不使用 TCP。它使用“用戶數據報協議 (User Datagram Protocol)”,也叫 “UDP” (請參考 RFC-768。)

為什么它們是無連接的呢?主要是因為它并不象流式套接字那樣維持一個連接。你只要建立一個包,構造一個有目標信息的IP 頭,然后發出去。無需連接。它們通常使用于傳輸包-包信息。簡單的應用程序有:tftp, bootp等等。

你也許會想:“假如數據丟失了這些程序如何正常工作?”我的朋友,每個程序在 UDP 上有自己的協議。例如,tftp 協議每發出的一個被接受到包,收到者必須發回一個包來說“我收到了!” (一個“命令正確應答”也叫“ACK” 包)。如果在一定時間內(例如5秒),發送方沒有收到應答,它將重新發送,直到得到 ACK。這一ACK過程在實現SOCK_DGRAM 應用程序的時候非常重要。

簡單的發送和接收實現

服務器端接收代碼:

 

 
  1. #include <Winsock2.h> 
  2. #pragma comment(lib,"Ws2_32.lib") 
  3. #include <stdio.h> 
  4. #include <memory.h> 
  5.  
  6. void main() 
  7. WSAData wsd; 
  8. WSAStartup(MAKEWORD(2,0),&wsd); 
  9.  
  10. SOCKET s =NULL; 
  11. s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  12. struct sockaddr_in ch; 
  13. memset(&ch,0,sizeof(ch)); 
  14. ch.sin_family=AF_INET; 
  15. ch.sin_addr.s_addr=INADDR_ANY; 
  16. ch.sin_port=htons(1041); 
  17. int b=bind(s,(struct sockaddr *) &ch,sizeof(ch)); 
  18. #define QUEUE_SIZE 5 
  19. int l=listen(s,QUEUE_SIZE); 
  20. printf("正在監聽本機的1041端口!/n"); 
  21. SOCKET sc=accept(s,0,0); 
  22. printf("客戶端已經連接到本機的1041端口!/n"); 
  23. #define BUF_SIZE 4096 
  24. int receByt=0; 
  25. while(1) 
  26. char buf[BUF_SIZE]; 
  27. receByt=recv(sc,buf,BUF_SIZE,0); 
  28. buf[receByt]='/0'
  29. if(receByt>0) 
  30. printf("接收的消息是:%s/n",buf); 
  31. else 
  32. printf("接收消息結束!"); 
  33. break
  34.  
  35. int ic=closesocket(sc); 
  36. int is=closesocket(s); 
  37.  

客戶端發送的代碼:

 

 
  1. #include <Winsock2.h> 
  2. #pragma comment(lib,"Ws2_32.lib") 
  3. #include <stdio.h> 
  4. #include <memory.h> 
  5. #include <string.h> 
  6.  
  7. void main() 
  8. WSAData wsd; 
  9. WSAStartup(MAKEWORD(2,0),&wsd); 
  10.  
  11. SOCKET s =NULL; 
  12. s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  13. struct sockaddr_in ch; 
  14. memset(&ch,0,sizeof(ch)); 
  15. ch.sin_family=AF_INET; 
  16. ch.sin_addr.s_addr=inet_addr("127.0.0.1"); 
  17. ch.sin_port=htons(1041); 
  18.  
  19. int c=connect(s,(struct sockaddr *) &ch,sizeof(ch)); 
  20. printf("已經連接到服務器的1041端口!現在可以向服務器發送消息了!/n"); 
  21. #define BUF_SIZE 4096 
  22. char info[1024],buf[BUF_SIZE]; 
  23.  
  24. while(1) 
  25. gets(info); 
  26. if(info[0]=='/0'
  27. break
  28. strcpy(buf,info); 
  29. int nsend=send(s,buf,strlen(buf),0); 
  30.  
  31. int ic=closesocket(s); 

程序代碼經過了優化,并且整合多線程,把接收和發送放到同一個文件中,使用參數模式調用發送和接收模塊。增加了創建SOCKET的創建的時候s句柄(或對象)判斷返回值是否為INVALID_SOCKET,以及socket的bind操作的返回值是否為SOCKET_ERROR,其他socket的操作應該也判斷SOCKET_ERROR,以保證程序的穩定性,這里只是測試代碼就不去寫這么多了,剩下的就由你個人發揮。

 

 
  1. #include <Winsock2.h> 
  2. #pragma comment(lib,"Ws2_32.lib") 
  3. #include <stdio.h> 
  4. #include <memory.h> 
  5. #include <string.h> 
  6. #include <pthread.h> 
  7.  
  8.  
  9. void Receive(); 
  10. void Send(); 
  11. void creatThread(); 
  12.  
  13. SOCKET s =NULL; 
  14. pthread_t t[1000]; 
  15. int threadCount=0; 
  16.  
  17. void main(int argc,char* argv[]) 
  18. printf("本程序制作人學號:713901040041/n"); 
  19. printf("程序說明:服務器端和客戶端為同一個程序,請使用不同的參數運行./n"); 
  20. printf("接收程序請使用 r參數;發送程序請使用 s參數。/n"); 
  21. //printf("len : %d/n", argc); 
  22. //printf("count %d/n",argc); 
  23. //printf("value: %s/n",argv[1]); 
  24. //printf("%d",argv[1][0]=='r'); 
  25.  
  26. if(argc<=1) 
  27. printf("please input program arguments .../n"); 
  28. exit(0); 
  29. if(argc>1 && argv[1][0]=='r'
  30. printf("run receive .../n"); 
  31. Receive(); 
  32. if(argc>1 && argv[1][0]=='s'
  33. printf("run send .../n"); 
  34. Send(); 
  35.  
  36.  
  37. void* receiveWork(void * args) 
  38. SOCKET sc=accept(s,0,0); 
  39. if(sc==INVALID_SOCKET) 
  40. printf("sc Error"); 
  41. creatThread(); 
  42.  
  43. printf("----------客戶端已經連接到本機的%d線程連接!/n",threadCount-2); 
  44. #define BUF_SIZE 4096 
  45. int receByt=0; 
  46. while(1) 
  47. char buf[BUF_SIZE]; 
  48. receByt=recv(sc,buf,BUF_SIZE,0); 
  49. buf[receByt]='/0'
  50. if(receByt>0) 
  51. printf("線程接收的消息是:%s/n",buf); 
  52. else 
  53. printf("客戶端已退出,"); 
  54. break
  55.  
  56. int ic=closesocket(sc); 
  57. printf("服務器結束連接!/n"); 
  58. return NULL; 
  59.  
  60. void creatThread() 
  61. pthread_create(&t[threadCount++],NULL,receiveWork,NULL); 
  62.  
  63.  
  64. void Receive() 
  65. WSAData wsd; 
  66. WSAStartup(MAKEWORD(2,0),&wsd);  
  67. s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  68. if(s==INVALID_SOCKET) 
  69. printf("socket created Error"); 
  70. struct sockaddr_in ch; 
  71. memset(&ch,0,sizeof(ch)); 
  72. ch.sin_family=AF_INET; 
  73. ch.sin_addr.s_addr=INADDR_ANY; 
  74. ch.sin_port=htons(1041); 
  75. int b=bind(s,(struct sockaddr *) &ch,sizeof(ch)); 
  76. if(b==SOCKET_ERROR) 
  77. printf("bind 失敗,出錯代碼是:%d/n",WSAGetLastError()); 
  78. exit(0); 
  79. #define QUEUE_SIZE 5 
  80. int l=listen(s,QUEUE_SIZE); 
  81. printf("正在監聽本機的1041端口!/n"); 
  82.  
  83. creatThread(); 
  84.  
  85. for(int i=0;i<1000;i++) 
  86. pthread_join(t[i],NULL); 
  87.  
  88. int is=closesocket(s); 
  89.  
  90.  
  91.  
  92. void Send() 
  93. WSAData wsd; 
  94. WSAStartup(MAKEWORD(2,0),&wsd); 
  95.  
  96. SOCKET s =NULL; 
  97. s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  98. if(s==INVALID_SOCKET) 
  99. printf("socket created Error"); 
  100. struct sockaddr_in ch; 
  101. memset(&ch,0,sizeof(ch)); 
  102. ch.sin_family=AF_INET; 
  103. ch.sin_addr.s_addr=inet_addr("127.0.0.1"); 
  104. ch.sin_port=htons(1041); 
  105.  
  106. int c=connect(s,(struct sockaddr *) &ch,sizeof(ch)); 
  107. printf("已經連接到服務器的1041端口!現在可以向服務器發送消息了!/n"); 
  108. #define BUF_SIZE 4096 
  109. char info[1024],buf[BUF_SIZE]; 
  110.  
  111. while(1) 
  112. gets(info); 
  113. if(info[0]=='/0'
  114. break
  115. strcpy(buf,info); 
  116. int nsend=send(s,buf,strlen(buf),0); 
  117. int ic=closesocket(s); 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产天堂久久综合网| 韩国欧美亚洲国产| 国产在线播放91| 国产成人福利网站| 国产精品v片在线观看不卡| 日韩大片免费观看视频播放| 亚洲aa中文字幕| 国产福利视频一区| 亚洲色图综合久久| 97色在线播放视频| 国产91露脸中文字幕在线| 国产激情综合五月久久| 91天堂在线视频| 国产人妖伪娘一区91| 97精品在线视频| 海角国产乱辈乱精品视频| 麻豆国产va免费精品高清在线| 日韩电影在线观看免费| 国产一区二区三区网站| 91九色国产在线| 欧美一级片在线播放| 日本亚洲欧洲色| 亚洲bt欧美bt日本bt| 国产亚洲精品91在线| 日本成人免费在线| 色婷婷亚洲mv天堂mv在影片| 国产精品自拍网| www.欧美三级电影.com| 欧美中文字幕第一页| 亚洲精品免费网站| 亚洲91精品在线观看| 国产91久久婷婷一区二区| 亚洲午夜国产成人av电影男同| 欧美精品九九久久| 国产精品爽黄69天堂a| 疯狂做受xxxx欧美肥白少妇| 九九久久综合网站| 久久久久久久久久久亚洲| 久久久国产精彩视频美女艺术照福利| 亚洲免费伊人电影在线观看av| 亚洲第一级黄色片| 夜夜嗨av一区二区三区免费区| 国产精品偷伦免费视频观看的| 国产欧美亚洲视频| 中文字幕精品网| 亚洲一区二区福利| 欧美成人精品在线| 欧美极品在线视频| 亚洲国产精品电影在线观看| 亚洲丝袜一区在线| 国产精品视频午夜| 亚洲女人天堂网| 国产精品扒开腿做爽爽爽的视频| 国产一区二区三区久久精品| 国产午夜一区二区| 精品国产乱码久久久久久虫虫漫画| 久久夜色精品国产亚洲aⅴ| 欧美精品18videos性欧美| 国产成人综合av| 国产精品美女视频网站| 精品亚洲国产视频| 狠狠躁天天躁日日躁欧美| 国产精品夜间视频香蕉| 色老头一区二区三区在线观看| 国产精品福利在线观看| 成人黄色激情网| 久久九九热免费视频| 中文字幕不卡av| 色综合91久久精品中文字幕| 久久久久免费视频| 色综合久久久久久中文网| 日本一区二区在线免费播放| 国内精品免费午夜毛片| 亚洲视频欧洲视频| 欧美洲成人男女午夜视频| 欧美日韩国产中文精品字幕自在自线| 精品视频在线播放色网色视频| 国产91色在线|| 欧美一区二区三区免费观看| 国产亚洲成av人片在线观看桃| 亚洲精品日产aⅴ| 久久亚洲一区二区三区四区五区高| 精品福利在线视频| 日本免费一区二区三区视频观看| 亚洲欧美日韩直播| 77777少妇光屁股久久一区| 久久久久久国产免费| 日韩风俗一区 二区| 久久精品久久久久久国产 免费| 亚洲精品99久久久久| 国产一区二区三区在线| 国产69精品久久久久99| 欧美俄罗斯乱妇| 午夜精品久久久久久久久久久久久| 成人激情视频在线播放| 欧美色视频日本高清在线观看| 亚洲女人天堂成人av在线| 夜夜嗨av色综合久久久综合网| 欧美成人精品xxx| 国产性猛交xxxx免费看久久| 中文字幕自拍vr一区二区三区| 国产99视频在线观看| 国产va免费精品高清在线| 国产一区二区日韩精品欧美精品| 中文字幕欧美专区| 久久久国产精彩视频美女艺术照福利| 91啪国产在线| 色爱精品视频一区| 日韩av在线一区二区| 亚洲一区二区三区在线免费观看| 久久97久久97精品免视看| 欧美日韩免费区域视频在线观看| 亚洲午夜性刺激影院| 欧美日韩国产中字| 日本成人激情视频| 91免费版网站入口| 中文精品99久久国产香蕉| 中文字幕久热精品视频在线| 欧美亚洲免费电影| 成人日韩av在线| 亚洲国产欧美一区| 亚洲人成网站色ww在线| 色小说视频一区| 久久av红桃一区二区小说| 久久久久久久成人| 成人黄色午夜影院| 欧美电影免费播放| 国产一区二区三区四区福利| 亚洲片国产一区一级在线观看| 日韩欧美在线字幕| 亚洲影影院av| 欧美精品中文字幕一区| 久久男人资源视频| 色播久久人人爽人人爽人人片视av| 日韩欧美国产高清91| 在线色欧美三级视频| 欧美在线视频导航| 亚洲视频欧美视频| 精品国产成人av| 精品一区二区三区四区在线| 日韩中文字在线| 国产精品老牛影院在线观看| 91超碰中文字幕久久精品| 美日韩丰满少妇在线观看| 亚洲无线码在线一区观看| 欧美激情亚洲激情| 亚洲最大的av网站| 亚洲男人天堂网| 日韩电影在线观看免费| 成人国产精品一区二区| 国产亚洲精品久久久久久牛牛| 97精品在线视频| 国产精品国模在线| 亚洲色图13p| 欧美在线精品免播放器视频| 欧美高清视频在线| 亚洲午夜性刺激影院| 久久精品夜夜夜夜夜久久| 亚洲性视频网址| 亚洲精品小视频| 日韩福利在线播放| 韩国欧美亚洲国产| 久久视频在线播放| 久久久精品在线观看|