亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? windows socket api 使用經驗.txt

?? 我在畢業設計過程中涉及到socket編程
?? TXT
字號:
Windows Socket API 使用經驗
 
2003-3-26 13:53:05   5XSOFT   唐綱   閱讀次數: 22662 
本文是我在進行MS-Windows、HP-Unix網絡編程的實踐過程中總結出來的一些經驗,僅供大家參考。本文所談到的Socket函數如果沒有特別說明,都是指的Windows Socket API。

一、WSAStartup函數
   int WSAStartup(
     WORD wVersionRequested,  
     LPWSADATA lpWSAData  
   );
   使用Socket的程序在使用Socket之前必須調用WSAStartup函數。該函數的第一個參數指明程序請求使用的Socket版本,其中高位字節指明副版本、低位字節指明主版本;操作系統利用第二個參數返回請求的Socket的版本信息。當一個應用程序調用WSAStartup函數時,操作系統根據請求的Socket版本來搜索相應的Socket庫,然后綁定找到的Socket庫到該應用程序中。以后應用程序就可以調用所請求的Socket庫中的其它Socket函數了。該函數執行成功后返回0。
例:假如一個程序要使用2.1版本的Socket,那么程序代碼如下
           wVersionRequested = MAKEWORD( 2, 1 );
           err = WSAStartup( wVersionRequested, &wsaData );

二、WSACleanup函數
   int WSACleanup (void);
   應用程序在完成對請求的Socket庫的使用后,要調用WSACleanup函數來解除與Socket庫的綁定并且釋放Socket庫所占用的系統資源。

三、socket函數
  SOCKET socket(
     int af,       
     int type,     
     int protocol  
   );
   應用程序調用socket函數來創建一個能夠進行網絡通信的套接字。第一個參數指定應用程序使用的通信協議的協議族,對于TCP/IP協議族,該參數置PF_INET;第二個參數指定要創建的套接字類型,流套接字類型為SOCK_STREAM、數據報套接字類型為SOCK_DGRAM;第三個參數指定應用程序所使用的通信協議。該函數如果調用成功就返回新創建的套接字的描述符,如果失敗就返回INVALID_SOCKET。套接字描述符是一個整數類型的值。每個進程的進程空間里都有一個套接字描述符表,該表中存放著套接字描述符和套接字數據結構的對應關系。該表中有一個字段存放新創建的套接字的描述符,另一個字段存放套接字數據結構的地址,因此根據套接字描述符就可以找到其對應的套接字數據結構。每個進程在自己的進程空間里都有一個套接字描述符表但是套接字數據結構都是在操作系統的內核緩沖里。下面是一個創建流套接字的例子:
       struct protoent *ppe;
       ppe=getprotobyname("tcp");
       SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto);

四、closesocket函數
  int closesocket(
     SOCKET s  
   );
   closesocket函數用來關閉一個描述符為s套接字。由于每個進程中都有一個套接字描述符表,表中的每個套接字描述符都對應了一個位于操作系統緩沖區中的套接字數據結構,因此有可能有幾個套接字描述符指向同一個套接字數據結構。套接字數據結構中專門有一個字段存放該結構的被引用次數,即有多少個套接字描述符指向該結構。當調用closesocket函數時,操作系統先檢查套接字數據結構中的該字段的值,如果為1,就表明只有一個套接字描述符指向它,因此操作系統就先把s在套接字描述符表中對應的那條表項清除,并且釋放s對應的套接字數據結構;如果該字段大于1,那么操作系統僅僅清除s在套接字描述符表中的對應表項,并且把s對應的套接字數據結構的引用次數減1。
closesocket函數如果執行成功就返回0,否則返回SOCKET_ERROR。

五、send函數
  int send(
     SOCKET s,              
     const char FAR *buf,  
     int len,               
     int flags              
   );
   不論是客戶還是服務器應用程序都用send函數來向TCP連接的另一端發送數據。客戶程序一般用send函數向服務器發送請求,而服務器則通常用send函數來向客戶程序發送應答。該函數的第一個參數指定發送端套接字描述符;第二個參數指明一個存放應用程序要發送數據的緩沖區;第三個參數指明實際要發送的數據的字節數;第四個參數一般置0。這里只描述同步Socket的send函數的執行流程。當調用該函數時,send先比較待發送數據的長度len和套接字s的發送緩沖區的長度,如果len大于s的發送緩沖區的長度,該函數返回SOCKET_ERROR;如果len小于或者等于s的發送緩沖區的長度,那么send先檢查協議是否正在發送s的發送緩沖中的數據,如果是就等待協議把數據發送完,如果協議還沒有開始發送s的發送緩沖中的數據或者s的發送緩沖中沒有數據,那么send就比較s的發送緩沖區的剩余空間和len,如果len大于剩余空間大小send就一直等待協議把s的發送緩沖中的數據發送完,如果len小于剩余空間大小send就僅僅把buf中的數據copy到剩余空間里(注意并不是send把s的發送緩沖中的數據傳到連接的另一端的,而是協議傳的,send僅僅是把buf中的數據copy到s的發送緩沖區的剩余空間里)。如果send函數copy數據成功,就返回實際copy的字節數,如果send在copy數據時出現錯誤,那么send就返回SOCKET_ERROR;如果send在等待協議傳送數據時網絡斷開的話,那么send函數也返回SOCKET_ERROR。要注意send函數把buf中的數據成功copy到s的發送緩沖的剩余空間里后它就返回了,但是此時這些數據并不一定馬上被傳到連接的另一端。如果協議在后續的傳送過程中出現網絡錯誤的話,那么下一個Socket函數就會返回SOCKET_ERROR。(每一個除send外的Socket函數在執行的最開始總要先等待套接字的發送緩沖中的數據被協議傳送完畢才能繼續,如果在等待時出現網絡錯誤,那么該Socket函數就返回SOCKET_ERROR)
注意:在Unix系統下,如果send在等待協議傳送數據時網絡斷開的話,調用send的進程會接收到一個SIGPIPE信號,進程對該信號的默認處理是進程終止。

六、recv函數
   int recv(
     SOCKET s,       
     char FAR *buf,  
     int len,        
     int flags       
   );
   不論是客戶還是服務器應用程序都用recv函數從TCP連接的另一端接收數據。該函數的第一個參數指定接收端套接字描述符;第二個參數指明一個緩沖區,該緩沖區用來存放recv函數接收到的數據;第三個參數指明buf的長度;第四個參數一般置0。這里只描述同步Socket的recv函數的執行流程。當應用程序調用recv函數時,recv先等待s的發送緩沖中的數據被協議傳送完畢,如果協議在傳送s的發送緩沖中的數據時出現網絡錯誤,那么recv函數返回SOCKET_ERROR,如果s的發送緩沖中沒有數據或者數據被協議成功發送完畢后,recv先檢查套接字s的接收緩沖區,如果s接收緩沖區中沒有數據或者協議正在接收數據,那么recv就一直等待,只到協議把數據接收完畢。當協議把數據接收完畢,recv函數就把s的接收緩沖中的數據copy到buf中(注意協議接收到的數據可能大于buf的長度,所以在這種情況下要調用幾次recv函數才能把s的接收緩沖中的數據copy完。recv函數僅僅是copy數據,真正的接收數據是協議來完成的),recv函數返回其實際copy的字節數。如果recv在copy時出錯,那么它返回SOCKET_ERROR;如果recv函數在等待協議接收數據時網絡中斷了,那么它返回0。
注意:在Unix系統下,如果recv函數在等待協議接收數據時網絡斷開了,那么調用recv的進程會接收到一個SIGPIPE信號,進程對該信號的默認處理是進程終止。

七、bind函數
  int bind(
     SOCKET s,                          
     const struct sockaddr FAR *name,   
     int namelen                        
   );
   當創建了一個Socket以后,套接字數據結構中有一個默認的IP地址和默認的端口號。一個服務程序必須調用bind函數來給其綁定一個IP地址和一個特定的端口號。客戶程序一般不必調用bind函數來為其Socket綁定IP地址和斷口號。該函數的第一個參數指定待綁定的Socket描述符;第二個參數指定一個sockaddr結構,該結構是這樣定義的: 
struct sockaddr { 
           u_short sa_family; 
           char sa_data[14]; 
       };
  sa_family指定地址族,對于TCP/IP協議族的套接字,給其置AF_INET。當對TCP/IP協議族的套接字進行綁定時,我們通常使用另一個地址結構:
       struct sockaddr_in {
           short   sin_family;
           u_short sin_port;
           struct  in_addr sin_addr;
           char    sin_zero[8];
       };
   其中sin_family置AF_INET;sin_port指明端口號;sin_addr結構體中只有一個唯一的字段s_addr,表示IP地址,該字段是一個整數,一般用函數inet_addr()把字符串形式的IP地址轉換成unsigned long型的整數值后再置給s_addr。有的服務器是多宿主機,至少有兩個網卡,那么運行在這樣的服務器上的服務程序在為其Socket綁定IP地址時可以把htonl(INADDR_ANY)置給s_addr,這樣做的好處是不論哪個網段上的客戶程序都能與該服務程序通信;如果只給運行在多宿主機上的服務程序的Socket綁定一個固定的IP地址,那么就只有與該IP地址處于同一個網段上的客戶程序才能與該服務程序通信。我們用0來填充sin_zero數組,目的是讓sockaddr_in結構的大小與sockaddr結構的大小一致。下面是一個bind函數調用的例子:
   struct sockaddr_in saddr;
   saddr.sin_family = AF_INET;
   saddr.sin_port = htons(8888);
   saddr.sin_addr.s_addr = htonl(INADDR_ANY);
   bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr));

八、listen函數
   int listen( SOCKET s, int backlog );
   服務程序可以調用listen函數使其流套接字s處于監聽狀態。處于監聽狀態的流套接字s將維護一個客戶連接請求隊列,該隊列最多容納backlog個客戶連接請求。假如該函數執行成功,則返回0;如果執行失敗,則返回SOCKET_ERROR。

九、accept函數
   SOCKET accept(
     SOCKET s, 
     struct sockaddr FAR *addr,  
     int FAR *addrlen  
   );
   服務程序調用accept函數從處于監聽狀態的流套接字s的客戶連接請求隊列中取出排在最前的一個客戶請求,并且創建一個新的套接字來與客戶套接字創建連接通道,如果連接成功,就返回新創建的套接字的描述符,以后與客戶套接字交換數據的是新創建的套接字;如果失敗就返回INVALID_SOCKET。該函數的第一個參數指定處于監聽狀態的流套接字;操作系統利用第二個參數來返回新創建的套接字的地址結構;操作系統利用第三個參數來返回新創建的套接字的地址結構的長度。下面是一個調用accept的例子:
       struct sockaddr_in ServerSocketAddr;
       int addrlen;
       addrlen=sizeof(ServerSocketAddr);
       ServerSocket=accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen);

十、connect函數
   int connect(
     SOCKET s,                          
     const struct sockaddr FAR *name,  
     int namelen                        
   );
   客戶程序調用connect函數來使客戶Socket s與監聽于name所指定的計算機的特定端口上的服務Socket進行連接。如果連接成功,connect返回0;如果失敗則返回SOCKET_ERROR。下面是一個例子:
       struct sockaddr_in daddr;
       memset((void *)&daddr,0,sizeof(daddr));
       daddr.sin_family=AF_INET;
       daddr.sin_port=htons(8888);
       daddr.sin_addr.s_addr=inet_addr("133.197.22.4");
       connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr)); 
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美bbbbb| 欧美大胆一级视频| 精品国产免费人成电影在线观看四季| 久久精品免视看| 性做久久久久久免费观看| 国产99久久久国产精品免费看| 欧美日韩精品二区第二页| 国产精品天天摸av网| 麻豆精品在线播放| 欧美午夜精品一区| 日韩一区在线免费观看| 国产成人8x视频一区二区| 日韩三级视频中文字幕| 亚洲综合色网站| 国产成人超碰人人澡人人澡| 精品少妇一区二区三区视频免付费| 一级中文字幕一区二区| av电影在线观看不卡| 久久婷婷国产综合国色天香| 麻豆精品一区二区综合av| 欧美日韩国产大片| 亚洲成人动漫精品| 欧洲亚洲国产日韩| 一区二区三区四区高清精品免费观看| 高清不卡在线观看av| 久久久久国产精品麻豆ai换脸| 精品一区二区三区免费毛片爱| 欧美剧情电影在线观看完整版免费励志电影 | 日韩精品国产精品| 欧美性生交片4| 亚洲国产日韩av| 欧美日韩精品一区视频| 亚洲国产一区二区三区| 在线观看视频91| 亚洲综合在线免费观看| 欧美午夜在线观看| 天天综合网 天天综合色| 在线观看91av| 久久精品国产亚洲高清剧情介绍| 精品捆绑美女sm三区| 极品瑜伽女神91| 国产精品日韩成人| 99re热视频这里只精品| 一区二区三区欧美日| 欧美日韩国产区一| 精品一区二区三区在线观看国产 | 欧美性生活一区| 午夜国产精品一区| 日韩精品中午字幕| 国产精品中文欧美| 国产精品国产成人国产三级| 91免费在线播放| 亚洲国产成人av| 日韩欧美亚洲一区二区| 国产乱人伦偷精品视频不卡| 亚洲欧洲www| 欧美日韩另类一区| 国产一区二区0| 亚洲免费观看在线观看| 91精品国产综合久久久久久漫画| 精品在线一区二区| 综合在线观看色| 91精品国产综合久久久久久| 国产一区二区网址| 亚洲精品久久7777| 欧美一区二区三区在线| 成人免费毛片高清视频| 亚洲自拍偷拍欧美| 国产夜色精品一区二区av| 欧美影院一区二区| 国产一区二区久久| 免费高清成人在线| 国产精品国产三级国产aⅴ无密码| 欧美人与z0zoxxxx视频| 蜜臂av日日欢夜夜爽一区| 综合久久一区二区三区| 欧美一区日本一区韩国一区| 不卡的看片网站| 免费人成黄页网站在线一区二区| 国产精品视频观看| 日韩视频在线永久播放| 色视频成人在线观看免| 国产精品一区在线观看乱码| 五月天网站亚洲| 亚洲欧美一区二区三区国产精品| 精品动漫一区二区三区在线观看| 欧美视频你懂的| 色综合久久中文综合久久牛| 国产成人免费视频网站高清观看视频 | 91精品国产福利在线观看| 成人免费观看av| 国产一区二区福利| 日本大胆欧美人术艺术动态| 亚洲精品日韩一| 中文字幕中文字幕中文字幕亚洲无线| 日韩免费观看2025年上映的电影| 欧美在线不卡一区| 色999日韩国产欧美一区二区| 成人在线视频一区| 国产成人精品午夜视频免费| 激情综合五月婷婷| 麻豆高清免费国产一区| 免费成人美女在线观看| 日韩和欧美一区二区| 午夜精彩视频在线观看不卡| 亚洲一区二区三区四区的 | 天堂久久一区二区三区| 亚洲一区二区三区四区在线| 亚洲免费高清视频在线| 亚洲色图都市小说| 亚洲天堂2014| 亚洲色大成网站www久久九九| 中文字幕精品一区二区精品绿巨人| 久久精品一区四区| 国产欧美日韩久久| 国产精品五月天| 国产精品欧美久久久久一区二区| 国产精品每日更新| 国产精品国产自产拍在线| 国产精品乱子久久久久| 国产精品电影院| 亚洲精品视频在线观看免费| 一区二区三区不卡视频在线观看| 亚洲伊人伊色伊影伊综合网| 亚洲第一电影网| 99视频一区二区| 91麻豆蜜桃一区二区三区| 色8久久人人97超碰香蕉987| 欧美日韩一区二区三区免费看 | 91蝌蚪porny| 欧美日韩视频第一区| 欧美一区日本一区韩国一区| 久久亚洲综合色一区二区三区| 国产精品拍天天在线| 亚洲精品亚洲人成人网| 日本一区中文字幕| 国产精品一二三| 91蜜桃在线观看| 欧美日本乱大交xxxxx| 久久伊人中文字幕| 亚洲精品日产精品乱码不卡| 丝袜亚洲精品中文字幕一区| 国精品**一区二区三区在线蜜桃| 成人美女视频在线观看18| 91久久精品一区二区| 欧美一区2区视频在线观看| 国产偷国产偷亚洲高清人白洁| 国产精品美女久久久久aⅴ国产馆| 一区二区三区在线观看动漫| 老司机免费视频一区二区三区| 成人av在线网| 3d动漫精品啪啪一区二区竹菊| 久久午夜羞羞影院免费观看| 亚洲丝袜美腿综合| 蜜桃在线一区二区三区| jlzzjlzz国产精品久久| 91精品国产综合久久久久久漫画| 国产欧美一区二区在线| 日韩成人一级大片| 成人av先锋影音| 欧美成人性战久久| 亚洲自拍偷拍图区| 国产黄色精品网站| 欧美女孩性生活视频| 欧美激情一区在线观看| 日韩精品久久久久久| 99re热这里只有精品视频| 欧美精品一区二区三区久久久| 亚洲最新视频在线播放| 成人av资源在线| 精品国产乱码久久久久久1区2区| 亚洲国产一区二区视频| av网站免费线看精品| 久久只精品国产| 久久精品国产澳门| 欧美视频中文字幕| 日韩美女啊v在线免费观看| 韩国精品免费视频| 日韩欧美aaaaaa| 日本成人超碰在线观看| 在线观看中文字幕不卡| 国产精品毛片a∨一区二区三区| 九色porny丨国产精品| 欧美在线视频不卡| 伊人夜夜躁av伊人久久| 不卡的av网站| 欧美国产综合一区二区| 在线免费观看日本欧美| 国产精品网站在线观看| 国产精品一品二品| 久久精品一区八戒影视| 激情都市一区二区| 欧美精品一区二| 六月丁香婷婷久久| 欧美成人艳星乳罩| 久久精品国产网站| 久久综合精品国产一区二区三区| 美女网站一区二区| 日韩手机在线导航| 国内久久精品视频|