青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 131, comments - 12, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

Windows Socket編程

Posted on 2012-12-25 15:10 盛勝 閱讀(621) 評論(0)  編輯 收藏 引用
http://www.shnenglu.com/bujiwu/archive/2012/09/05/71707.html
Windows下Socket編程主要包括以下幾部分:
服務端
   1、初始化Windows Socket庫。
   2、創(chuàng)建Socket。
   3、綁定Socket。
   4、監(jiān)聽。
   5、Accept。
   6、接收、發(fā)送數據。

客戶端
   1、初始化Windows Socket庫。
   2、創(chuàng)建Socket。
   3、連接Socket。
   4、接收、發(fā)送數據。

服務端每接收到一個客戶端的Socket,則創(chuàng)建一個線程。滿足一個服務端連接多個客戶端。

  1 //Server.cpp
  2 #include <iostream>
  3 #include <Windows.h>
  4 
  5 using namespace std;
  6 
  7 #define  PORT 4000
  8 #define  IP_ADDRESS "192.168.1.145"
  9 
 10 DWORD WINAPI ClientThread(LPVOID lpParameter)
 11 {
 12     SOCKET CientSocket = (SOCKET)lpParameter;
 13     int Ret = 0;
 14     char RecvBuffer[MAX_PATH];
 15 
 16     while ( true )
 17     {
 18         memset(RecvBuffer, 0x00sizeof(RecvBuffer));
 19         Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
 20         if ( Ret == 0 || Ret == SOCKET_ERROR ) 
 21         {
 22             cout<<"客戶端退出!"<<endl;
 23             break;
 24         }
 25         cout<<"接收到客戶信息為:"<<RecvBuffer<<endl;
 26     }
 27 
 28     return 0;
 29 }
 30 
 31 int main(int argc, char* argv[])
 32 {
 33     WSADATA  Ws;
 34     SOCKET ServerSocket, CientSocket;
 35     struct sockaddr_in LocalAddr, ClientAddr;
 36     int Ret = 0;
 37     int AddrLen = 0;
 38     HANDLE hThread = NULL;
 39 
 40     //Init Windows Socket
 41     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
 42     {
 43         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
 44         return -1;
 45     }
 46     
 47     //Create Socket
 48     ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 49     if ( ServerSocket == INVALID_SOCKET )
 50     {
 51         cout<<"Create Socket Failed::"<<GetLastError()<<endl;
 52         return -1;
 53     }
 54 
 55     LocalAddr.sin_family = AF_INET;
 56     LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
 57     LocalAddr.sin_port = htons(PORT);
 58     memset(LocalAddr.sin_zero, 0x008);
 59 
 60     //Bind Socket
 61     Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
 62     if ( Ret != 0 )
 63     {
 64         cout<<"Bind Socket Failed::"<<GetLastError()<<endl;
 65         return -1;
 66     }
 67 
 68     Ret = listen(ServerSocket, 10);
 69     if ( Ret != 0 )
 70     {
 71         cout<<"listen Socket Failed::"<<GetLastError()<<endl;
 72         return -1;
 73     }
 74 
 75     cout<<"服務端已經啟動"<<endl;
 76 
 77     while ( true )
 78     {
 79         AddrLen = sizeof(ClientAddr);
 80         CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
 81         if ( CientSocket == INVALID_SOCKET )
 82         {
 83             cout<<"Accept Failed::"<<GetLastError()<<endl;
 84             break;
 85         }
 86 
 87         cout<<"客戶端連接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;
 88         
 89         hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);
 90         if ( hThread == NULL )
 91         {
 92             cout<<"Create Thread Failed!"<<endl;
 93             break;
 94         }
 95 
 96         CloseHandle(hThread);
 97     }
 98 
 99     closesocket(ServerSocket);
100     closesocket(CientSocket);
101     WSACleanup();
102 
103     return 0;
104 }

 1 //Client.cpp
 2 #include <iostream>
 3 #include <Windows.h>
 4 
 5 using namespace std;
 6 
 7 #define  PORT 4000
 8 #define  IP_ADDRESS "192.168.1.145"
 9 
10 
11 int main(int argc, char* argv[])
12 {
13     WSADATA  Ws;
14     SOCKET CientSocket;
15     struct sockaddr_in ServerAddr;
16     int Ret = 0;
17     int AddrLen = 0;
18     HANDLE hThread = NULL;
19     char SendBuffer[MAX_PATH];
20 
21     //Init Windows Socket
22     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
23     {
24         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
25         return -1;
26     }
27 
28     //Create Socket
29     CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
30     if ( CientSocket == INVALID_SOCKET )
31     {
32         cout<<"Create Socket Failed::"<<GetLastError()<<endl;
33         return -1;
34     }
35 
36     ServerAddr.sin_family = AF_INET;
37     ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
38     ServerAddr.sin_port = htons(PORT);
39     memset(ServerAddr.sin_zero, 0x008);
40 
41     Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
42     if ( Ret == SOCKET_ERROR )
43     {
44         cout<<"Connect Error::"<<GetLastError()<<endl;
45         return -1;
46     }
47     else
48     {
49         cout<<"連接成功!"<<endl;
50     }
51 
52     while ( true )
53     {
54         cin.getline(SendBuffer, sizeof(SendBuffer));
55         Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
56         if ( Ret == SOCKET_ERROR )
57         {
58             cout<<"Send Info Error::"<<GetLastError()<<endl;
59             break;
60         }
61     }
62     
63     closesocket(CientSocket);
64     WSACleanup();
65 
66     return 0;
67 }

很幽默的講解六種Windows Socket I/O模型

老陳有一個在外地工作的女兒,不能經常回來,老陳和她通過信件聯(lián)系。他們的信會被郵遞員投遞到他們的信箱里。
這和Socket模型非常類似。下面我就以老陳接收信件為例講解Socket I/O模型~~~

一:select模型

老陳非常想看到女兒的信。以至于他每隔10分鐘就下樓檢查信箱,看是否有女兒的信~~~~~
在這種情況下,"下樓檢查信箱"然后回到樓上耽誤了老陳太多的時間,以至于老陳無法做其他工作。
select模型和老陳的這種情況非常相似:周而復始地去檢查......如果有數據......接收/ 發(fā)送.......

使用線程來select應該是通用的做法:
http://tangfeng.iteye.com/blog/518135

 


二:WSAAsyncSelect模型

后來,老陳使用了微軟公司的新式信箱。這種信箱非常先進,一旦信箱里有新的信件,蓋茨就會給老陳打電話:喂,大爺,你有新的信件了!從此,老陳再也不必頻繁上下樓檢查信箱了,牙也不疼了,你瞅準了,藍天......不是,微軟~~~~~~~~
微軟提供的WSAAsyncSelect模型就是這個意思。

WSAAsyncSelect 模型是Windows下最簡單易用的一種Socket I/O模型。使用這種模型時,Windows會把網絡事件以消息的形勢通知應用程序。

http://tangfeng.iteye.com/blog/518141

 

 

三:WSAEventSelect模型

后來,微軟的信箱非常暢銷,購買微軟信箱的人以百萬計數......以至于蓋茨每天24小時給客戶打電話,累得腰酸背痛,喝啥都不好使~~~~~~
微軟改進了他們的信箱:在客戶的家中添加一個附加裝置,這個裝置會監(jiān)視客戶的信箱,每當新的信件來臨,此裝置會發(fā)出"新信件到達"聲,提醒老陳去收信。蓋茨終于可以睡覺了。

http://tangfeng.iteye.com/blog/518142 

四:Overlapped I/O 事件通知模型

后來,微軟通過調查發(fā)現,老陳不喜歡上下樓收發(fā)信件,因為上下樓其實很浪費時間。于是微軟再次改進他們的信箱。新式的信箱采用了更為先進的技術,只要用戶告訴微軟自己的家在幾樓幾號,新式信箱會把信件直接傳送到用戶的家中,然后告訴用戶,你的信件已經放到你的家中了!老陳很高興,因為他不必再親自收發(fā)信件了!

Overlapped I/O 事件通知模型和WSAEventSelect模型在實現上非常相似,主要區(qū)別在"Overlapped",Overlapped模型是讓應用程序使用重疊數據結構(WSAOVERLAPPED),一次投遞一個或多個Winsock I/O請求。這些提交的請求完成后,應用程序會收到通知。什么意思呢?就是說,如果你想從socket上接收數據,只需要告訴系統(tǒng),由系統(tǒng)為你接收數據,而你需要做的只是為系統(tǒng)提供一個緩沖區(qū)~~~~~
http://tangfeng.iteye.com/blog/518146 

五:Overlapped I/O 完成例程模型

老陳接收到新的信件后,一般的程序是:打開信封----掏出信紙----閱讀信件----回復信件......為了進一步減輕用戶負擔,微軟又開發(fā)了一種新的技術:用戶只要告訴微軟對信件的操作步驟,微軟信箱將按照這些步驟去處理信件,不再需要用戶親自拆信/閱讀 /回復了!老陳終于過上了小資生活!

http://tangfeng.iteye.com/blog/518146 

六:IOCP模型

微軟信箱似乎很完美,老陳也很滿意。但是在一些大公司情況卻完全不同!這些大公司有數以萬計的信箱,每秒鐘都有數以百計的信件需要處理,以至于微軟信箱經常因超負荷運轉而崩潰!需要重新啟動!微軟不得不使出殺手锏......
微軟給每個大公司派了一名名叫"Completion Port"的超級機器人,讓這個機器人去處理那些信件!

"Windows NT小組注意到這些應用程序的性能沒有預料的那么高。特別的,處理很多同時的客戶請求意味著很多線程并發(fā)地運行在系統(tǒng)中。因為所有這些線程都是可運行的 [沒有被掛起和等待發(fā)生什么事],Microsoft意識到NT內核花費了太多的時間來轉換運行線程的上下文[Context],線程就沒有得到很多 CPU時間來做它們的工作。大家可能也都感覺到并行模型的瓶頸在于它為每一個客戶請求都創(chuàng)建了一個新線程。創(chuàng)建線程比起創(chuàng)建進程開銷要小,但也遠不是沒有開銷的。我們不妨設想一下:如果事先開好N個線程,讓它們在那hold[堵塞],然后可以將所有用戶的請求都投遞到一個消息隊列中去。然后那N個線程逐一從消息隊列中去取出消息并加以處理。就可以避免針對每一個用戶請求都開線程。不僅減少了線程的資源,也提高了線程的利用率。理論上很不錯,你想我等泛泛之輩都能想出來的問題,Microsoft又怎會沒有考慮到呢?"-----摘自nonocast的《理解I/O Completion Port》

先看一下IOCP模型的實現:

http://tangfeng.iteye.com/blog/518148 

IOCP不是一個普通的對象,不需要考慮線程安全問題。它會自動調配訪問它的線程:如果某個socket上有一個線程A正在訪問,那么線程B的訪問請求會被分配到另外一個socket。這一切都是由系統(tǒng)自動調配的,我們無需過問。


只有注冊用戶登錄后才能發(fā)表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费伊人电影在线观看av| 久久久久久久91| 亚洲欧美日韩综合aⅴ视频| 中文一区字幕| 欧美日韩精品福利| 亚洲人午夜精品免费| 亚洲高清一二三区| 蜜桃av噜噜一区二区三区| 欧美成人精品一区二区| 亚洲国产成人精品久久久国产成人一区 | 欧美性大战久久久久久久| 99精品免费| 午夜精品久久久久久久久| 国产精品乱码| 国产亚洲电影| 亚洲二区视频在线| 99精品久久免费看蜜臀剧情介绍| 欧美伦理视频网站| 亚洲视频导航| 久久久久国色av免费看影院 | 国产欧美日韩另类一区| 午夜精品久久| 欧美福利视频在线观看| a4yy欧美一区二区三区| 国产精品你懂得| 久久国产精品久久久| 欧美夫妇交换俱乐部在线观看| 亚洲最新在线视频| 国产美女诱惑一区二区| 久久久久成人网| 亚洲人成亚洲人成在线观看| 亚洲欧美日韩国产| 在线国产亚洲欧美| 欧美日韩免费观看一区二区三区 | 国产欧美日韩| 免费一级欧美在线大片| aa级大片欧美三级| 久久九九电影| 99爱精品视频| 国产欧美一区二区三区久久 | 欧美 亚欧 日韩视频在线| 日韩午夜在线观看视频| 久久久久久久久蜜桃| 一区二区免费在线播放| 国产日韩欧美在线一区| 欧美电影在线观看| 欧美亚洲免费| 亚洲人成在线播放| 久久久久看片| 亚洲小说区图片区| 影音先锋久久久| 国产精品vip| 免费不卡中文字幕视频| 西瓜成人精品人成网站| 亚洲剧情一区二区| 欧美成年人网| 久久精品一区中文字幕| 中文日韩电影网站| 亚洲国产精品一区二区久| 国产精品无码永久免费888| 欧美黑人一区二区三区| 久久久久久香蕉网| 亚洲欧洲99久久| 这里只有精品电影| 亚洲黄色成人| 另类亚洲自拍| 久久成人亚洲| 亚洲欧美www| 日韩视频免费观看高清在线视频| 韩国精品久久久999| 国产精品青草久久久久福利99| 欧美激情影音先锋| 久久久国产亚洲精品| 亚洲欧美激情一区| 中文国产一区| 一本色道久久| 艳女tv在线观看国产一区| 亚洲激情婷婷| 亚洲国产小视频在线观看| 麻豆成人在线| 伊人春色精品| 久久夜色精品| 欧美与黑人午夜性猛交久久久| 日韩写真视频在线观看| 91久久综合| 亚洲高清免费| 欧美韩日一区| 免费观看欧美在线视频的网站| 久久精品人人做人人综合 | 亚洲手机视频| 一本色道88久久加勒比精品| 亚洲精品久久在线| 亚洲激情视频在线播放| 亚洲国产一区二区三区在线播| 国产综合久久久久久| 国产一区二区三区在线观看视频 | 免费视频最近日韩| 免费成人小视频| 欧美ed2k| 欧美精品123区| 欧美日韩成人综合在线一区二区| 欧美日韩一区自拍| 国产精品久久久久毛片软件| 国产九九视频一区二区三区| 国产一区二区日韩精品| 亚洲成人在线免费| 亚洲人成高清| 一区二区三区你懂的| 亚洲欧美国产77777| 欧美一区二区三区日韩| 久久久久女教师免费一区| 免费观看在线综合色| 亚洲第一在线综合在线| 亚洲日本在线观看| 亚洲一区二区高清视频| 久久精彩免费视频| 欧美国产日韩一区| 欧美日一区二区三区在线观看国产免| 欧美视频四区| 国产亚洲欧美在线| 亚洲国产天堂久久综合| 亚洲午夜高清视频| 久久精品免费观看| 亚洲电影观看| 一区二区三区欧美亚洲| 羞羞色国产精品| 免费观看一区| 国产精品家庭影院| 精品99一区二区三区| 日韩视频精品在线| 久久国产精品99国产| 亚洲成人在线视频网站| 亚洲视频免费观看| 久久精品道一区二区三区| 欧美电影免费观看| 国产精品视频一二| 亚洲国产精品精华液网站| 亚洲午夜精品| 久久综合久色欧美综合狠狠| 亚洲激情国产精品| 久久国产高清| 欧美午夜精品久久久久久浪潮| 国模私拍一区二区三区| 夜夜爽夜夜爽精品视频| 久久午夜影视| 一区二区三区高清在线| 久久综合五月| 国产麻豆精品在线观看| 日韩午夜激情av| 久久裸体视频| 一区二区三区视频免费在线观看 | 亚洲精品美女| 久久精品99国产精品日本| 欧美日韩免费区域视频在线观看| 国内精品亚洲| 亚洲欧美日韩一区二区| 亚洲国产精品久久| 久久久久久久久久久成人| 欧美成人免费在线观看| 男女av一区三区二区色多| 国产精品永久免费视频| 99re66热这里只有精品3直播 | 在线视频亚洲欧美| 欧美国产91| 久久精品99国产精品日本| 国产精品美女久久久久av超清 | 国产精品丝袜91| 日韩视频免费观看| 欧美/亚洲一区| 羞羞色国产精品| 国产精品久久久久久久免费软件| 亚洲毛片在线免费观看| 免费观看成人www动漫视频| 欧美一区二区三区四区在线观看| 欧美性天天影院| 一区二区三区日韩欧美| 亚洲国内精品| 欧美成人网在线| 亚洲韩国日本中文字幕| 欧美77777| 久久青草欧美一区二区三区| 国产一区二区三区日韩欧美| 欧美一级片一区| 亚洲欧美经典视频| 国产日本欧洲亚洲| 欧美一区二区三区四区在线观看地址| 正在播放亚洲一区| 国产精品国产自产拍高清av王其| 这里只有视频精品| 一区二区三区不卡视频在线观看 | 一本大道久久a久久精二百| 欧美精品粉嫩高潮一区二区 | 亚洲主播在线| 亚洲图片欧美日产| 国产精品美腿一区在线看| 香蕉视频成人在线观看 | 亚洲电影毛片| 欧美肥婆在线| 一区二区三区国产精华| 艳女tv在线观看国产一区|