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

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

Windows Socket編程

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

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

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

  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<<"服務(wù)端已經(jīng)啟動(dòng)"<<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模型

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

一:select模型

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

使用線程來(lái)select應(yīng)該是通用的做法:
http://tangfeng.iteye.com/blog/518135

 


二:WSAAsyncSelect模型

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

WSAAsyncSelect 模型是Windows下最簡(jiǎn)單易用的一種Socket I/O模型。使用這種模型時(shí),Windows會(huì)把網(wǎng)絡(luò)事件以消息的形勢(shì)通知應(yīng)用程序。

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

 

 

三:WSAEventSelect模型

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

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

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

后來(lái),微軟通過(guò)調(diào)查發(fā)現(xiàn),老陳不喜歡上下樓收發(fā)信件,因?yàn)樯舷聵瞧鋵?shí)很浪費(fèi)時(shí)間。于是微軟再次改進(jìn)他們的信箱。新式的信箱采用了更為先進(jìn)的技術(shù),只要用戶告訴微軟自己的家在幾樓幾號(hào),新式信箱會(huì)把信件直接傳送到用戶的家中,然后告訴用戶,你的信件已經(jīng)放到你的家中了!老陳很高興,因?yàn)樗槐卦儆H自收發(fā)信件了!

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

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

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

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

六:IOCP模型

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

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

先看一下IOCP模型的實(shí)現(xiàn):

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

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


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            欧美在线观看视频| 日韩视频―中文字幕| 国产欧美一区二区白浆黑人| 午夜精品剧场| 久久久久九九视频| 欧美黄色大片网站| 欧美一区二区三区日韩| 国产午夜精品美女视频明星a级| 久久久精品视频成人| 亚洲第一福利社区| 亚洲一区在线观看免费观看电影高清| 国产麻豆综合| 欧美激情片在线观看| 午夜久久久久久久久久一区二区| 欧美二区不卡| 亚洲欧美日韩精品久久| 亚洲二区视频在线| 国产精品hd| 免费短视频成人日韩| 亚洲一区二区视频在线观看| 欧美韩日一区二区| 亚欧美中日韩视频| 9色porny自拍视频一区二区| 国产尤物精品| 国产精品vip| 看欧美日韩国产| 亚洲欧美经典视频| 99av国产精品欲麻豆| 久久中文字幕一区| 亚洲一区二区视频在线观看| 激情成人综合| 国产精品国色综合久久| 久久综合国产精品| 午夜精品国产精品大乳美女| 亚洲欧洲视频在线| 免费观看成人| 欧美影院视频| 亚洲一区欧美一区| 亚洲免费播放| 亚洲国产99| 国产专区一区| 国产精品一区亚洲| 欧美日韩一区三区四区| 欧美成人精品高清在线播放| 久久九九久久九九| 午夜免费久久久久| 亚洲图片你懂的| 亚洲精品综合精品自拍| 欧美激情精品久久久久久免费印度 | 亚洲午夜av| 午夜一区二区三区不卡视频| 亚洲乱码国产乱码精品精可以看| 欧美va天堂在线| 久久精品国产99精品国产亚洲性色| 在线综合+亚洲+欧美中文字幕| 亚洲日本免费电影| 亚洲第一页自拍| 精品白丝av| 伊人天天综合| 在线观看日韩www视频免费 | 国产精品igao视频网网址不卡日韩| 免费成人在线观看视频| 久久夜色精品国产亚洲aⅴ | 久久婷婷成人综合色| 久久激情视频免费观看| 欧美中文字幕视频| 久久国产精品色婷婷| 亚洲欧美中文日韩v在线观看| 亚洲网站啪啪| 亚洲欧美久久久久一区二区三区| 一区二区三区免费观看| 在线视频日韩| 亚洲一区在线观看视频| 亚洲一区精品电影| 亚洲综合激情| 午夜激情综合网| 噜噜噜久久亚洲精品国产品小说| 久久久久99| 久久亚洲一区| 欧美国产视频在线| 欧美人与禽猛交乱配视频| 欧美日韩不卡| 国产精品二区在线| 国产日韩精品一区二区三区在线| 国产婷婷色一区二区三区四区| 国产色爱av资源综合区| 国产自产v一区二区三区c| 在线看日韩欧美| 久久综合五月| 欧美黄在线观看| 国产精品电影网站| 国产亚洲一区二区三区在线播放| 国内精品一区二区三区| 亚洲福利视频一区| 日韩视频亚洲视频| 亚洲自拍16p| 久久精品日韩欧美| 欧美wwwwww| 日韩亚洲欧美高清| 午夜精品www| 美女91精品| 欧美日韩天堂| 国产一区二区中文| 亚洲精品乱码| 欧美亚洲免费在线| 另类激情亚洲| 亚洲靠逼com| 性欧美1819sex性高清| 免费成人美女女| 国产精品网站在线播放| 影音先锋亚洲精品| 日韩视频一区二区三区在线播放| 亚洲女优在线| 欧美成人精品在线| 99爱精品视频| 久久精品91| 欧美日韩在线三区| 韩国成人精品a∨在线观看| 亚洲精品中文字| 中文高清一区| 久久在线播放| 国产精品黄页免费高清在线观看| 国产午夜精品久久久久久免费视 | 亚洲影院免费| 蘑菇福利视频一区播放| 99国产精品99久久久久久| 欧美一区二区高清| 欧美激情a∨在线视频播放| 国产精品久久久| 在线日韩精品视频| 午夜久久一区| 欧美国产综合一区二区| 香蕉久久一区二区不卡无毒影院| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品免费区二区三区观看| 亚洲国产老妈| 欧美伊人久久久久久久久影院| 亚洲区一区二| 久久一区中文字幕| 国产麻豆精品久久一二三| 亚洲伦理中文字幕| 久久先锋资源| 亚洲一级在线观看| 欧美另类99xxxxx| 在线欧美福利| 久久精品女人天堂| 夜夜嗨av一区二区三区四区| 久久这里有精品视频 | 欧美激情第六页| 小处雏高清一区二区三区 | 免费成人在线观看视频| 国产一区二区三区四区五区美女| 一本色道久久88综合日韩精品| 美女91精品| 西瓜成人精品人成网站| 99热免费精品| 久久亚洲电影| 欧美天堂亚洲电影院在线观看 | 久久久精品国产免费观看同学| 噜噜噜在线观看免费视频日韩| 亚洲欧美日韩在线综合| 欧美日韩综合网| 在线观看亚洲精品| 毛片精品免费在线观看| 免费成人在线视频网站| 中文成人激情娱乐网| 亚洲婷婷在线| 狠狠色丁香婷婷综合影院| 牛牛影视久久网| 欧美成人久久| 亚洲一区二区免费在线| 午夜精品久久久99热福利| 国产真实久久| 亚洲国产精品热久久| 欧美视频中文在线看| 欧美一级免费视频| 久久久青草婷婷精品综合日韩| 亚洲美女诱惑| 亚洲调教视频在线观看| 影音国产精品| 久久成人免费网| 久久夜色精品国产噜噜av| 一区二区三区成人| 午夜国产精品视频| 亚洲国产91色在线| 艳妇臀荡乳欲伦亚洲一区| 国产欧美日韩精品在线| 欧美成人免费在线| 欧美视频一区二区在线观看| 久久蜜桃av一区精品变态类天堂| 欧美aa国产视频| 亚洲欧洲99久久| 噜噜爱69成人精品| 亚洲综合日本| 久久综合伊人77777| 亚洲亚洲精品在线观看 | 亚洲成人自拍视频| 一区二区三区黄色| 亚洲成色精品| 亚洲在线国产日韩欧美|