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

首頁 > 編程 > C > 正文

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

2020-01-26 14:49:18
字體:
來源:轉載
供稿:網友

什么是socket
  你經常聽到人們談論著 “socket”,或許你還不知道它的確切含義。現在讓我告訴你:它是使用 標準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 應用程序的時候非常重要。

簡單的發送和接收實現

服務器端接收代碼:

#include <Winsock2.h>#pragma comment(lib,"Ws2_32.lib")#include <stdio.h>#include <memory.h>void main(){WSAData wsd;WSAStartup(MAKEWORD(2,0),&wsd);SOCKET s =NULL;s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);struct sockaddr_in ch;memset(&ch,0,sizeof(ch));ch.sin_family=AF_INET;ch.sin_addr.s_addr=INADDR_ANY;ch.sin_port=htons(1041);int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));#define QUEUE_SIZE 5int l=listen(s,QUEUE_SIZE);printf("正在監聽本機的1041端口!/n");SOCKET sc=accept(s,0,0);printf("客戶端已經連接到本機的1041端口!/n");#define BUF_SIZE 4096int receByt=0;while(1){char buf[BUF_SIZE];receByt=recv(sc,buf,BUF_SIZE,0);buf[receByt]='/0';if(receByt>0){printf("接收的消息是:%s/n",buf);}else{printf("接收消息結束!");break;}}int ic=closesocket(sc);int is=closesocket(s);}

客戶端發送的代碼:

#include <Winsock2.h>#pragma comment(lib,"Ws2_32.lib")#include <stdio.h>#include <memory.h>#include <string.h>void main(){WSAData wsd;WSAStartup(MAKEWORD(2,0),&wsd);SOCKET s =NULL;s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);struct sockaddr_in ch;memset(&ch,0,sizeof(ch));ch.sin_family=AF_INET;ch.sin_addr.s_addr=inet_addr("127.0.0.1");ch.sin_port=htons(1041);int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));printf("已經連接到服務器的1041端口!現在可以向服務器發送消息了!/n");#define BUF_SIZE 4096char info[1024],buf[BUF_SIZE];while(1){gets(info);if(info[0]=='/0')break;strcpy(buf,info);int nsend=send(s,buf,strlen(buf),0);}int ic=closesocket(s);}

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

#include <Winsock2.h>#pragma comment(lib,"Ws2_32.lib")#include <stdio.h>#include <memory.h>#include <string.h>#include <pthread.h>void Receive();void Send();void creatThread();SOCKET s =NULL;pthread_t t[1000];int threadCount=0;void main(int argc,char* argv[]){  printf("本程序制作人學號:713901040041/n");  printf("程序說明:服務器端和客戶端為同一個程序,請使用不同的參數運行./n");  printf("接收程序請使用 r參數;發送程序請使用 s參數。/n");  //printf("len : %d/n", argc);  //printf("count %d/n",argc);  //printf("value: %s/n",argv[1]);  //printf("%d",argv[1][0]=='r');  if(argc<=1)  {    printf("please input program arguments .../n");    exit(0);  }  if(argc>1 && argv[1][0]=='r')  {    printf("run receive .../n");    Receive();  }  if(argc>1 && argv[1][0]=='s')  {    printf("run send .../n");    Send();  }}void* receiveWork(void * args){  SOCKET sc=accept(s,0,0);  if(sc==INVALID_SOCKET)  {    printf("sc Error");  }  creatThread();  printf("----------客戶端已經連接到本機的%d線程連接!/n",threadCount-2);#define BUF_SIZE 4096  int receByt=0;  while(1)  {    char buf[BUF_SIZE];    receByt=recv(sc,buf,BUF_SIZE,0);    buf[receByt]='/0';    if(receByt>0)    {      printf("線程接收的消息是:%s/n",buf);    }    else    {      printf("客戶端已退出,");      break;    }        }  int ic=closesocket(sc);  printf("服務器結束連接!/n");  return NULL;}void creatThread(){  pthread_create(&t[threadCount++],NULL,receiveWork,NULL);}void Receive(){  WSAData wsd;  WSAStartup(MAKEWORD(2,0),&wsd);    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  if(s==INVALID_SOCKET)  {    printf("socket created Error");  }  struct sockaddr_in ch;  memset(&ch,0,sizeof(ch));  ch.sin_family=AF_INET;  ch.sin_addr.s_addr=INADDR_ANY;  ch.sin_port=htons(1041);  int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));  if(b==SOCKET_ERROR)  {    printf("bind 失敗,出錯代碼是:%d/n",WSAGetLastError());    exit(0);  }#define QUEUE_SIZE 5  int l=listen(s,QUEUE_SIZE);  printf("正在監聽本機的1041端口!/n");    creatThread();  for(int i=0;i<1000;i++)  {    pthread_join(t[i],NULL);  }int is=closesocket(s);}void Send(){  WSAData wsd;  WSAStartup(MAKEWORD(2,0),&wsd);  SOCKET s =NULL;  s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  if(s==INVALID_SOCKET)  {    printf("socket created Error");  }  struct sockaddr_in ch;  memset(&ch,0,sizeof(ch));  ch.sin_family=AF_INET;  ch.sin_addr.s_addr=inet_addr("127.0.0.1");  ch.sin_port=htons(1041);  int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));  printf("已經連接到服務器的1041端口!現在可以向服務器發送消息了!/n");#define BUF_SIZE 4096  char info[1024],buf[BUF_SIZE];  while(1)  {    gets(info);    if(info[0]=='/0')      break;    strcpy(buf,info);    int nsend=send(s,buf,strlen(buf),0);  }  int ic=closesocket(s);}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩在线视频一区| 亚洲国产精品yw在线观看| 精品久久久久久久久久久久久久| 亚洲日本欧美日韩高观看| 日韩av不卡电影| 亚洲国产高潮在线观看| 国产欧美一区二区三区四区| 欧美综合在线第二页| 欧美高清视频在线观看| 麻豆成人在线看| 日韩美女主播视频| 成人性生交大片免费看小说| 欧美乱人伦中文字幕在线| 日本午夜人人精品| 亚洲高清免费观看高清完整版| 日韩中文字幕久久| 亚洲无线码在线一区观看| 成人性教育视频在线观看| 亚洲www在线| 亚洲第一天堂无码专区| 在线观看欧美日韩国产| 97免费视频在线播放| 国产精品视频自在线| 日韩在线视频导航| 国产在线观看不卡| 亚洲精品久久在线| 日韩欧美国产激情| 欧美最猛性xxxxx(亚洲精品)| 欧美乱大交做爰xxxⅹ性3| 亚洲国产精品人人爽夜夜爽| 国产亚洲一区精品| 伊人激情综合网| 欧美激情网友自拍| 日韩av理论片| 伊人久久久久久久久久久| 精品国产一区二区三区久久狼黑人| 日韩中文字幕不卡视频| 日韩亚洲欧美中文在线| 亚洲性无码av在线| 欧美视频在线看| 精品久久久国产精品999| 亚洲人成在线观| 精品国产一区二区三区久久久| 亚洲自拍偷拍视频| 国产精品日韩在线观看| 日韩成人在线视频观看| 26uuu日韩精品一区二区| 国产日韩在线观看av| 91成人免费观看网站| 成人激情视频在线播放| 亚洲精品永久免费| 成人黄色av免费在线观看| 国产午夜精品免费一区二区三区| 色诱女教师一区二区三区| 欧美区在线播放| 亚洲欧美日韩一区二区三区在线| 国产午夜精品一区二区三区| 国产成人综合一区二区三区| 97在线观看免费| 欧美视频在线观看免费| 亚洲а∨天堂久久精品喷水| 国产午夜精品视频| 狠狠色噜噜狠狠狠狠97| 欧美另类第一页| 国产精品美女网站| 92看片淫黄大片欧美看国产片| 欧美精品激情在线观看| 精品国产一区二区三区久久狼5月| 亚洲精品成人免费| 日韩欧美亚洲国产一区| 色偷偷88888欧美精品久久久| 亚洲自拍小视频免费观看| 这里只有精品丝袜| 亚洲精品乱码久久久久久按摩观| 欧美有码在线视频| 欧美重口另类videos人妖| 26uuu亚洲伊人春色| 日韩中文在线观看| 日韩欧美中文第一页| 久久99精品久久久久久琪琪| 久久色在线播放| 久久久人成影片一区二区三区| 欧洲日韩成人av| 色播久久人人爽人人爽人人片视av| 精品国产31久久久久久| 精品国产一区二区三区久久久狼| 国产精品国语对白| 另类图片亚洲另类| 亚洲电影免费观看高清完整版在线| 中文字幕精品视频| 久久久久亚洲精品成人网小说| 亚洲美女动态图120秒| 欧美尺度大的性做爰视频| 亚洲国产精品嫩草影院久久| 久久久最新网址| 国产精品精品视频| 91色p视频在线| 97香蕉久久夜色精品国产| 日韩精品免费看| 色悠悠国产精品| 国产视频一区在线| 国产精品美腿一区在线看| 国产精品大片wwwwww| 国产精品久久久久久久久久久久久久| 97婷婷大伊香蕉精品视频| 成人精品久久一区二区三区| 欧美性猛交xxxx富婆| 欧美男插女视频| 91久热免费在线视频| 亚洲成人教育av| 欧美日韩国产限制| 在线播放国产一区中文字幕剧情欧美| 91高潮在线观看| 国产精品一区二区久久久| 久久免费视频在线| 欧美中文字幕视频| 成人在线观看视频网站| 国产精品草莓在线免费观看| 91精品在线影院| 国产亚洲精品美女| 国产精品入口免费视频一| www国产精品视频| 18性欧美xxxⅹ性满足| 国产成+人+综合+亚洲欧美丁香花| 日韩欧美中文免费| 亚洲日韩欧美视频一区| 久久精品在线播放| 国产91色在线| 91超碰中文字幕久久精品| 国产中文欧美精品| 国产精品色午夜在线观看| 精品伊人久久97| 成人网页在线免费观看| 97香蕉久久夜色精品国产| 国产欧美久久一区二区| 亚洲国产私拍精品国模在线观看| 免费不卡在线观看av| 51久久精品夜色国产麻豆| 日本久久亚洲电影| 精品久久久久久久久久久久| 日韩一区二区欧美| 日韩欧美在线中文字幕| 韩国日本不卡在线| 欧美激情视频在线免费观看 欧美视频免费一| 日韩成人在线网站| 亚洲成人激情小说| 欧美性高潮在线| 成年无码av片在线| 成人欧美一区二区三区在线湿哒哒| 日韩亚洲欧美中文在线| 久久久久久91| 亚洲第一天堂无码专区| 91色在线观看| 日韩成人在线视频网站| 日韩美女免费观看| 国产在线精品成人一区二区三区| 亚洲天堂成人在线视频| 日韩中文第一页| 日韩在线视频中文字幕| 欧美激情网站在线观看| 国内精品视频久久| 色综合天天狠天天透天天伊人| 欧美国产日产韩国视频| 欧美高清视频在线播放|