锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品久久久一本精品,欧美v日韩v国产v,国产精品久久久久久久久借妻 http://www.shnenglu.com/amyvmiwei/category/6011.html 鎴樿儨鑷繁灝辨槸鎴樿儨涓鍒?
zh-cn Wed, 16 Mar 2011 04:37:48 GMT Wed, 16 Mar 2011 04:37:48 GMT 60 [杞琞Flex Socket 涓?C++ 閫氳 --- 瀹夊叏娌欑闂瑙e喅 http://www.shnenglu.com/amyvmiwei/archive/2011/03/16/141942.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Wed, 16 Mar 2011 02:22:00 GMT http://www.shnenglu.com/amyvmiwei/archive/2011/03/16/141942.html http://www.shnenglu.com/amyvmiwei/comments/141942.html http://www.shnenglu.com/amyvmiwei/archive/2011/03/16/141942.html#Feedback 0 http://www.shnenglu.com/amyvmiwei/comments/commentRss/141942.html http://www.shnenglu.com/amyvmiwei/services/trackbacks/141942.html Flex Socket 涓?C++ 閫氳 --- 瀹夊叏娌欑闂瑙e喅
鏈榪戜竴涓」鐩殑瀹㈡埛绔鏀規垚Flex錛屼嬌鐢⊿ocket涓嶤++閫氳鏃墮亣鍒頒簡瀹夊叏娌欑闂錛岃繖鏄垜鐨勮В鍐蟲柟娉曪紱
1):絳栫暐鏂囦歡涓庝富濂楁帴瀛楀湪鍚屼竴绔彛錛屽彧闇璋冪敤 Socket.connect() 鎴?XMLSocket.connect() 鏂規硶錛?/p>
2):絳栫暐鏂囦歡涓庝富濂楁帴瀛楀湪涓嶅悓绔彛錛岄渶浣跨敤鐗規畩鐨?#8220;xmlsocket”璇硶璋冪敤 Security.loadPolicyFile() 鏂規硶錛屽涓嬫墍紺猴細
Security.loadPolicyFile("xmlsocket://server.com:2525");
鍏堣皟鐢?Security.loadPolicyFile() 鏂規硶錛岀劧鍚庡啀璋冪敤 Socket.connect() 鎴?XMLSocket.connect() 鏂規硶銆?/p>
嫻嬭瘯浠g爜錛氫嬌鐢ㄥ悓涓绔彛
view plaincopy to clipboardprint? #include <winsock2.h> #include <windows.h> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") void main() { WORD wVersionRequested; WSADATA wsaData; int err; short port=1800;//绔彛鍙?nbsp; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData );//鍒濆鍖栧鎺ュ瓧 if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//鍒涘緩濂楁帴瀛?nbsp; SOCKET sockConn;//鐢ㄦ潵鍜屽鎴風閫氫俊鐨勫鎺ュ瓧 SOCKADDR_IN addrSrv;//鐢ㄦ潵鍜屽鎴風閫氫俊鐨勫鎺ュ瓧鍦板潃 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(port); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//緇戝畾绔彛 listen(sockSrv,5);//渚﹀惉 printf("Server %d is listening......\n",port); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); char buf[4096];//鎺ユ敹鐨勬暟鎹?nbsp; char rbuf[100]= "<cross-domain-policy> " "<allow-access-from domain=\"*\" to-ports=\"*\"/>" "</cross-domain-policy> ";//濂楁帴瀛楃瓥鐣ユ枃浠?nbsp; while(1) { //鎺ュ彈榪炴帴 sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); printf("Accept connection from %s\n",inet_ntoa(addrClient.sin_addr)); recv: //鎺ユ敹鏁版嵁 int bytes; if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR) { printf("鎺ユ敹鏁版嵁澶辮觸!\n"); exit(-1); } buf[bytes]='\0'; printf("Message from %s: %s\n",inet_ntoa(addrClient.sin_addr),buf); if (0 == strcmp(buf,"<policy-file-request/>")) { //鍙戦佹暟鎹?nbsp; if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR) { printf("鍙戦佹暟鎹け璐ワ紒"); exit(-1); } printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),rbuf); } else { //Echo if(send(sockConn,buf,strlen(buf)+1,0)==SOCKET_ERROR) { printf("鍙戦佹暟鎹け璐ワ紒"); exit(-1); } printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),buf); goto recv; } //娓呯悊濂楁帴瀛楀崰鐢ㄧ殑璧勬簮 closesocket(sockConn); } } #include <winsock2.h> #include <windows.h> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib")
void main() { WORD wVersionRequested; WSADATA wsaData; int err; short port=1800;//绔彛鍙?br> wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData );//鍒濆鍖栧鎺ュ瓧 if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//鍒涘緩濂楁帴瀛?br>SOCKET sockConn;//鐢ㄦ潵鍜屽鎴風閫氫俊鐨勫鎺ュ瓧 SOCKADDR_IN addrSrv;//鐢ㄦ潵鍜屽鎴風閫氫俊鐨勫鎺ュ瓧鍦板潃 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(port); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//緇戝畾绔彛 listen(sockSrv,5);//渚﹀惉 printf("Server %d is listening......\n",port); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); char buf[4096];//鎺ユ敹鐨勬暟鎹?br>char rbuf[100]= "<cross-domain-policy> " "<allow-access-from domain=\"*\" to-ports=\"*\"/>" "</cross-domain-policy> ";//濂楁帴瀛楃瓥鐣ユ枃浠?br> while(1) { //鎺ュ彈榪炴帴 sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); printf("Accept connection from %s\n",inet_ntoa(addrClient.sin_addr)); recv: //鎺ユ敹鏁版嵁 int bytes; if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR) { printf("鎺ユ敹鏁版嵁澶辮觸!\n"); exit(-1); }
buf[bytes]='\0'; printf("Message from %s: %s\n",inet_ntoa(addrClient.sin_addr),buf);
if (0 == strcmp(buf,"<policy-file-request/>")) { //鍙戦佹暟鎹?br> if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR) { printf("鍙戦佹暟鎹け璐ワ紒"); exit(-1); } printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),rbuf); } else { //Echo if(send(sockConn,buf,strlen(buf)+1,0)==SOCKET_ERROR) { printf("鍙戦佹暟鎹け璐ワ紒"); exit(-1); } printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),buf); goto recv; } //娓呯悊濂楁帴瀛楀崰鐢ㄧ殑璧勬簮 closesocket(sockConn); } }
鏃犺鏄摢縐嶆儏鍐碉紝鏈嶅姟鍣ㄥ潎蹇呴』絳夊緟瀹㈡埛绔殑絎竴嬈′紶杈撲箣鍚庡啀鍐沖畾鏄彂閫佺瓥鐣ユ枃浠惰繕鏄緩绔嬩富榪炴帴銆傚綋 Flash Player 璇鋒眰絳栫暐鏂囦歡鏃訛紝瀹冨緇堜細鍦ㄥ緩绔嬭繛鎺ュ悗浼犺緭浠ヤ笅瀛楃涓詫細
<policy-file-request/> 鏈嶅姟鍣ㄦ敹鍒版瀛楃涓插悗錛屽嵆浼氫紶杈撹絳栫暐鏂囦歡銆傜▼搴忓浜庣瓥鐣ユ枃浠惰姹傚拰涓昏繛鎺ュ茍涓嶄細浣跨敤鍚屼竴榪炴帴錛屽洜姝ゅ簲鍦ㄤ紶杈撶瓥鐣ユ枃浠跺悗鍏抽棴榪炴帴銆傚鏋滀笉鍏抽棴榪炴帴錛孎lash Player 灝嗗叧闂瓥鐣ユ枃浠惰繛鎺ワ紝涔嬪悗閲嶆柊榪炴帴浠ュ緩绔嬩富榪炴帴銆?/p>
闄勭綉緇滆祫鏂欙細
1,棣栧厛媯嫻嬬洰鏍囨湇鍔″櫒鐨?43绔彛鏄惁鎻愪緵瀹夊叏絳栫暐 2,濡傛灉1娌℃湁媯嫻嬪埌絳栫暐錛屽垯媯嫻媋ctionscript鏄惁浣跨敤浜哠ecurity.loadPolicyFile(xmlsocket://) 鎵嬫鎻愪緵瀹夊叏絳栫暐錛屽鏋滆繕娌℃嫻嬪埌錛屽垯浣跨敤絎?姝ユ嫻?br>3,媯嫻嬬洰鏍囨湇鍔″櫒鐩爣绔彛鏄惁鎻愪緵瀹夊叏絳栫暐
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/xuxiangwin/archive/2009/07/07/4324218.aspx
]]> 銆愯漿銆戝畬鎴愮鍙g殑涓涓畝鍗曞皝瑁呯被 http://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41439.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Fri, 18 Jan 2008 13:29:00 GMT http://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41439.html http://www.shnenglu.com/amyvmiwei/comments/41439.html http://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41439.html#Feedback 3 http://www.shnenglu.com/amyvmiwei/comments/commentRss/41439.html http://www.shnenglu.com/amyvmiwei/services/trackbacks/41439.html /////////////////////////////////////////////////////////////////////////////////////
// Iocp 澶存枃浠?/span>
#pragma once
#include <winsock2.h>
#pragma comment ( lib , "ws2_32.lib" )
const int OP_READ = 0;
const int OP_WRITE = 1;
const int OP_ACCEPT = 2;
/*
OVERLAPPEDPLUS 緇撴瀯浣撹璁℃濊礬
OVERLAPPED 鏄竴涓浐瀹氱殑鐢ㄤ簬澶勭悊緗戠粶娑堟伅浜嬩歡榪斿洖鍊肩殑緇撴瀯浣撳彉閲?/span>
鍦ㄥ畬鎴愮鍙e拰閲嶅彔 I/O 妯″瀷閲岀敤浜庤繑鍥炴秷鎭簨浠剁殑緇撴灉
鍥犱負鍦ㄥ鐞嗙綉緇滄秷鎭殑鏃跺欙紝鍙戦佺殑鏄竴涓繑鍥炲肩殑緇撴瀯浣撴寚閽堬紝鍙緇撴瀯浣?/span>
鐨勫墠闈㈤儴鍒嗘弧瓚崇郴緇熺殑瑕佹眰錛屽湪緋葷粺鎿嶄綔鎴愬姛鐨勬椂鍊欎篃灝變細鎶婅繖涓粨鏋勪綋鎸囬拡
鍙戝洖緇欑敤鎴鳳紝鎴戜滑鍙鍦ㄧ郴緇熷畾涔夌殑緇撴瀯浣撳悗闈㈡墿灞曚竴浜涜嚜宸辯殑涓滆タ錛屽氨鍙互
寰堣交鏉劇殑紜畾璇ユ秷鎭槸璋佸彂榪囨潵鐨勩?/span>
涓嶈繃濂藉儚瀹屾垚绔彛鍦ㄨ璁$殑鏃跺欎篃婊¤凍浜嗚繖鏍風殑闇姹傦紝鎵浠ュ湪榪欓噷鎴戝彧鏄斁鍏?/span>
涓浜涗笌緋葷粺榪炴帴鏈夊叧鐨勬暟鎹紝鐢ㄦ埛闇瑕佸瓨鏀劇殑鏁版嵁榪欓噷灝變笉鍦ㄥ瓨鏀?/span>
榪欓噷瀛樺偍涓庣郴緇熺浉鍏崇殑鏁版嵁鏈夛細
socket
OpCode 鏈娑堟伅鐨勬搷浣滅被鍨嬶紙鍦ㄥ畬鎴愮鍙g殑鎿嶄綔閲岄潰錛屾槸浠ユ秷鎭氱煡緋葷粺錛?/span>
璇繪暟鎹?/span>/ 鍐欐暟鎹紝閮芥槸瑕佸彂榪欐牱鐨勬秷鎭粨鏋勪綋榪囧幓鐨勶紝鎵浠ュ鏋滅郴緇熻鍚屾椂
榪涜璇誨啓鎿嶄綔鐨勮瘽錛屽氨闇瑕佹湁涓涓彉閲忔潵鍖哄垎鎿嶄綔浜嗭級
WSABUF wbuf; // 璇誨啓緙撳啿鍖虹粨鏋勪綋鍙橀噺
DWORD dwBytes, dwFlags; // 涓浜涘湪璇誨啓鏃剁敤鍒扮殑鏍囧織鎬у彉閲?/span>
char buf[4096]; // 鑷繁鐨勭紦鍐插尯
涓婇潰鐨?/span>4 涓彉閲忓瓨鏀劇殑鏄竴浜涗笌娑堟伅鐩稿叧鐨勬暟鎹紝閮芥槸涓浜涙搷浣滀笂鐢ㄥ埌鐨勶紝
榪欎簺涓滆タ閮芥槸鍥哄畾鐨勶紝鍏蜂綋浣滅敤闇瑕佸弬鑰冧竴涓嬪畬鎴愮鍙g浉鍏沖嚱鏁扮殑鍙傛暟鎺ュ彛
*/
struct OVERLAPPEDPLUS
{
OVERLAPPED ol;
SOCKET s;
int OpCode;
WSABUF wbuf;
DWORD dwBytes, dwFlags;
char buf[4096];
};
class CIOCP
{
protected :
HANDLE g_hwThread; // 宸ヤ綔綰跨▼鍙ユ焺
DWORD m_wthreadID;
HANDLE g_haThread; // 榪炴帴綰跨▼鍙ユ焺
DWORD m_athreadID;
public :
bool m_workThread;
bool m_acceptThread;
HANDLE m_hIocp; // 瀹屾垚绔彛鐨勫彞鏌?/span>
SOCKET m_sSocket;
public :
CIOCP(void );
~CIOCP(void );
virtual void OnRead(void * p, char *buf, int len){};
virtual void OnAccept(SOCKET socket);
virtual void OnClose(void * p){};
bool SetIoCompletionPort(SOCKET socket, void *p, char *buf = NULL, int len = 0);
// 鎶婁竴涓?/span>socket 涓庝竴涓嚜瀹氫箟鐨勭粨鏋勪綋鍏寵仈鍒板畬鎴愮鍙o紙鐩稿綋浜庢妸 socket 涓庝竴涓粨鏋勪綋鍙橀噺榪涜緇戝畾錛夛紝
// 榪欐牱褰撳彂閫佷笂闈?/span>3 縐嶇綉緇滀簨浠剁殑鏃跺欙紝璇ョ粨鏋勪綋鍙橀噺浼氬啀浼犲洖緇欑▼搴?/span>
// 榪欐牱灝卞彲浠ュ尯鍒嗗綋鍓嶇綉緇滀簨浠舵槸閭d釜 socket 鍙戝嚭鐨?/span>
bool Init(void );
bool Listen(int port);
static DWORD __stdcall WorkThread(LPVOID Param);
static DWORD __stdcall AcceptThread(LPVOID Param);
};
class CIOCPClient: public CIOCP
{
protected :
SOCKET m_socket;
public :
bool Connect(char *ip, int port);
void Send(char *buf, int len);
};
//////////////////////////////////////////////////////////////////////////////////////////
// Iocp 瀹炵幇鏂囦歡
#include "StdAfx.h"
#include "iocp.h"
static bool bInit = false ;
DWORD __stdcall CIOCP::WorkThread(LPVOID Param)
{
CIOCP * pthis = (CIOCP *)Param;
void * re;
OVERLAPPED * pOverlap;
DWORD berByte;
while (pthis->m_workThread)
{
int ret;
ret = GetQueuedCompletionStatus(pthis->m_hIocp, &berByte, (LPDWORD)&re, (LPOVERLAPPED *)&pOverlap, INFINITE);
if (ret == ERROR_SUCCESS)
{
}
if (berByte == 0)
{
// 瀹㈡埛绔柇寮榪炴帴
pthis->OnClose(re);
OVERLAPPEDPLUS *olp = (OVERLAPPEDPLUS *)pOverlap;
closesocket(olp->s);
delete olp; // 閲婃斁 涓?/span>socket 緇戝畾鐨勭粨鏋勪綋鍙橀噺
continue ;
}
if (re == NULL) return 0;
OVERLAPPEDPLUS *olp = (OVERLAPPEDPLUS *)pOverlap;
switch (olp->OpCode)
{
case OP_READ:
pthis->OnRead(re, olp->wbuf.buf, berByte); // 璋冪敤 OnRead() 閫氱煡搴旂敤紼嬪簭錛屾湇鍔″櫒鏀跺埌鏉ヨ嚜瀹㈡埛绔殑緗戠粶鏁版嵁
WSARecv(olp->s, &olp->wbuf, 1, &olp->dwBytes, &olp->dwFlags, &olp->ol, NULL); // 緇х畫璋冪敤涓涓帴鏀剁殑 I/O 寮傛璇鋒眰
break ;
default :
break ;
}
}
return 0;
}
DWORD __stdcall CIOCP::AcceptThread(LPVOID Param)
{
CIOCP * pthis = (CIOCP *)Param;
while (pthis->m_acceptThread)
{
SOCKET client;
if ((client= accept(pthis->m_sSocket, NULL, NULL)) == INVALID_SOCKET)
{
// 閿欒澶勭悊
}
pthis->OnAccept(client); // 璋冪敤 OnAccept() 閫氱煡搴旂敤紼嬪簭鏈夋柊瀹㈡埛绔繛鎺?/span>
}
return 1;
}
CIOCP::CIOCP(void )
{
}
CIOCP::~CIOCP(void )
{
}
bool CIOCP::Init(void )
{
if (bInit)
return true ;
WSADATA wsd;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
return false ;
bInit = true ;
return true ;
}
bool CIOCP::Listen(int port)
{
if (!bInit)
if (!Init())
return false ;
m_sSocket = socket(AF_INET, SOCK_STREAM, 0);
if (m_sSocket == INVALID_SOCKET)
return false ;
//SOCKADDR_IN addr;
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//addr.sin_addr.S_un.S_addr = inet_addr(ip);
if (bind(m_sSocket, (struct sockaddr *)&addr, sizeof (addr)) == SOCKET_ERROR)
return false ;
if (listen(m_sSocket, 10) == SOCKET_ERROR)
return false ;
if ((m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL) // 鍒涘緩瀹屾垚绔彛鐨勫彞鏌?/span>
return false ;
this ->m_acceptThread = true ;
g_haThread = CreateThread(NULL, 0, AcceptThread, (LPVOID)this , 0, &m_athreadID); // 鍒涘緩榪炴帴綰跨▼錛岀敤鏉ユ帴鏀跺鎴風鐨勮繛鎺?/span>
this ->m_workThread = true ;
g_hwThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this , 0, &m_wthreadID); // 鍒涘緩宸ヤ綔綰跨▼錛岀敤鏉ュ鐞嗗畬鎴愮鍙f秷鎭殑
return true ;
}
bool CIOCP::SetIoCompletionPort(SOCKET socket, void *p, char *buf, int len)
{
if (CreateIoCompletionPort((HANDLE)socket, m_hIocp, (ULONG_PTR)p, 0) == NULL)
return false ;
OVERLAPPEDPLUS *olp = new OVERLAPPEDPLUS;
memset(olp, 0, sizeof (OVERLAPPEDPLUS));
olp->s = socket;
if (buf)
{
// 榪欓噷鍙互浣跨敤鐢ㄦ埛鑷畾涔夌殑緙撳啿鍖哄湴鍧錛屽鏋滅敤鎴蜂笉鎯寵緗紝涔熷彲浠ラ噰鐢ㄩ粯璁ゅ垎閰嶇殑緙撳啿鍖?/span>
olp->wbuf.buf = buf;
olp->wbuf.len = len;
}
else
{
olp->wbuf.buf = olp->buf;
olp->wbuf.len = 4096;
}
olp->OpCode = OP_READ;
int ret = WSARecv(olp->s, &olp->wbuf, 1, &olp->dwBytes, &olp->dwFlags, &olp->ol, NULL);
if (ret == SOCKET_ERROR)
if (WSAGetLastError() != ERROR_IO_PENDING)
return false ;
return true ;
}
void CIOCP::OnAccept(SOCKET socket)
{
this ->SetIoCompletionPort(socket, NULL);
}
//===================================================================================
bool CIOCPClient::Connect(char *ip, int port)
{
// 榪炴帴鏈嶅姟鍣?/span>
if (!bInit)
if (!Init())
return false ;
// 鍒濆鍖栬繛鎺?/span>socket
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == SOCKET_ERROR)
{
// printf("cocket Create fail");
return false ;
}
// 濉啓鏈嶅姟鍣ㄥ湴鍧淇℃伅
// 绔彛涓?/span>1982
// IP 鍦板潃涓?/span>INADDR_ANY 錛屾敞鎰忎嬌鐢?/span>htonl 灝?/span>IP 鍦板潃杞崲涓虹綉緇滄牸寮?/span>ServerAddr.sin_family = AF_INET;
sockaddr_in ClientAddr;
ClientAddr.sin_family = AF_INET;
ClientAddr.sin_port = htons(port);
ClientAddr.sin_addr.s_addr = inet_addr(ip);
// 緇戝畾鐩戝惉绔彛
bind(m_socket, (SOCKADDR *)&ClientAddr, sizeof (ClientAddr));
if (connect(m_socket, (SOCKADDR *)&ClientAddr, sizeof (ClientAddr)) == SOCKET_ERROR)
{
return false ;
}
if ((m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL) // 鍒涘緩瀹屾垚绔彛鐨勫彞鏌?/span>
return false ;
this ->m_workThread = true ;
g_hwThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this , 0, &m_wthreadID); // 鍒涘緩宸ヤ綔綰跨▼錛岀敤鏉ュ鐞嗗畬鎴愮鍙f秷鎭殑
this ->SetIoCompletionPort(m_socket, &m_socket); // 璁劇疆瀹屾垚绔彛鐩戝惉鐨?/span>socket
return true ;
}
void CIOCPClient::Send(char *buf, int len)
{
send(m_socket, buf, len, 0);
}
///////////////////////////////////////////////////////////////////////////////////
// IOCPclient 搴旂敤浠g爜
#include "stdafx.h"
#include "IOCP.h"
#include "TClientSocket.h"
class Iocp :public CIOCPClient
{
void OnRead(void * p, char *buf, int len)
{
printf(buf);
Sleep(1000);
this ->Send(buf, len);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Iocp iocp;
iocp.Init();
iocp.Connect("127.0.0.1", 4311);
iocp.Send("test\0", 5);
gets(new char [1000]);
return 0;
}
]]>銆愯漿銆戝畬鎴愮鍙d笌楂樻ц兘鏈嶅姟鍣ㄧ▼搴忓紑鍙? http://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41438.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Fri, 18 Jan 2008 13:27:00 GMT http://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41438.html http://www.shnenglu.com/amyvmiwei/comments/41438.html http://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41438.html#Feedback 0 http://www.shnenglu.com/amyvmiwei/comments/commentRss/41438.html http://www.shnenglu.com/amyvmiwei/services/trackbacks/41438.html 鏃╁湪涓ゅ勾鍓嶆垜灝卞凡緇忚兘寰堢啛緇冪殑榪愮敤瀹屾垚绔彛榪欑鎶鏈簡,鍙槸涓鐩存病鏈夋満浼氬皢瀹冪敤鍦ㄤ粈涔堥」鐩腑,榪欐鏃墮棿瑙佸埌榪欑鎶鏈榪囧垎鐐掍綔,榪囧垎鐨勭縐樺寲,灝辨兂鍐欎竴綃囪В閲婂畠濡備綍宸ヤ綔鐨勬枃绔?鎯沖憡璇夊ぇ瀹跺畠娌℃湁浼犺涓殑閭d箞楂樻繁闅炬噦!鏈変粈涔堥敊璇殑鍦版柟榪樿楂樹漢鎸囨.杞澆璇鋒敞鏄庡嚭澶勫強浣滆?璋㈣阿! 浠ヤ竴涓枃浠朵紶杈撴湇鍔$涓轟緥,鍦ㄦ垜鐨勬満鍣ㄤ笂瀹冨彧璧蜂袱涓嚎紼嬪氨鍙互涓哄緢澶氫釜涓鎴風鍚屾椂鎻愪緵鏂囦歡涓嬭澆鏈嶅姟,紼嬪簭鐨勬ц兘浼氶殢鏈哄櫒鍐匔PU涓暟鐨勫鍔犺岀嚎鎬у闀?鎴戝敖鍙兘鍋氬埌浣垮畠娓呮櫚鏄撴噦,铏界劧紼嬪簭寰堝皬鍗寸敤鍒頒簡NT 5鐨勪竴浜涙柊鐗規?閲嶅彔IO,瀹屾垚绔彛浠ュ強綰跨▼姹?鍩轟簬榪欑妯″瀷鐨勬湇鍔$紼嬪簭搴旇鏄疦T緋葷粺涓婃ц兘鏈濂界殑浜? 棣栧厛.鍋氫負瀹屾垚绔彛鐨勫熀紜,鎴戜滑搴旇鐞嗚В閲嶅彔IO,榪欓渶瑕佷綘宸茬粡鐞嗚В浜嗗唴鏍稿璞″強鎿嶄綔緋葷粺鐨勪竴浜涙蹇墊蹇?浠涔堟槸淇″彿/闈炰俊鍙鋒?浠涔堟槸絳夊緟鍑芥暟,浠涔堟槸鎴愬姛絳夊緟鐨勫壇浣滅敤,浠涔堟槸綰跨▼鎸傝搗絳?濡傛灉榪欎簺姒備護榪樻病鏈夌悊瑙?浣犲簲璇ュ厛鐪嬩竴涓媁indows 鏍稿績緙栫▼涓殑鐩稿叧鍐呭.濡傛灉宸茬粡鐞嗚В榪欎簺,閭d箞閲嶅彔IO瀵逛綘鏉ヨ騫朵笉闅? 浣犲彲浠ヨ繖鏍瘋涓洪噸鍙營O,鐜板湪浣犲凡緇忚繘鍏ヤ竴涓湇鍔″櫒/瀹㈡埛鏈虹幆澧?璇蜂笉瑕佹販娣嗘蹇?榪欓噷鐨勬湇鍔″櫒鏄寚鎿嶄綔緋葷粺,鑰屽鎴鋒満鏄寚浣犵殑紼嬪簭(瀹冭繘琛孖O鎿嶄綔),鏄綋浣犺繘琛孖O鎿嶄綔(send,recv,writefile,readfile....)鏃朵綘鍙戦佷竴涓狪O璇鋒眰緇欐湇鍔″櫒(鎿嶄綔緋葷粺),鐢辨湇鍔″櫒鏉ュ畬鎴愪綘闇瑕佺殑鎿嶄綔,鐒跺悗浣犱粈涔堜簨閮芥病鏈変簡,褰撴湇鍔″櫒瀹屾垚IO璇鋒眰鏃跺畠浼氶氱煡浣?褰撶劧鍦ㄨ繖鏈熼棿浣犲彲浠ュ仛浠諱綍浜?涓涓父鐢ㄧ殑鎶宸ф槸鍦ㄥ彂閫侀噸鍙營O璇鋒眰鍚?紼嬪簭鍦ㄤ竴涓驚鐜腑涓杈硅皟鐢≒eekMessage,TranslateMessage鍜孌ispatchMessage鏇存柊鐣岄潰,鍚屾椂璋冪敤GetOverlappedResult絳夊緟鏈嶅姟鍣ㄥ畬鎴怚O鎿嶄綔,鏇撮珮鏁堜竴鐐圭殑鍋氭硶鏄嬌鐢↖O瀹屾垚渚嬬▼鏉ュ鐞嗘湇鍔″櫒(鎿嶄綔緋葷粺)榪斿洖鐨勭粨鏋?浣嗗茍涓嶆槸姣忎釜鏀寔閲嶅彔IO鎿嶄綔鐨勫嚱鏁伴兘鏀寔瀹屾垚渚嬬▼濡俆ransmitFile鍑芥暟. 渚?.涓嬈¢噸鍙犲啓鎿嶄綔榪囩▼(GetOverlappedResult鏂規硶): 1.濉啓涓涓狾VERLAPPED緇撴瀯 2.榪涜涓嬈″啓鎿嶄綔,騫舵寚瀹氶噸鍙犳搷浣滃弬鏁?涓婇潰鐨凮VERLAPPED緇撴瀯鍙橀噺鐨勬寚閽? 3.鍋氬叾瀹冧簨(濡傛洿鏂扮晫闈? 4.GetOverlappedResult鍙栨搷浣滅粨鏋?br>5.濡傛灉IO璇鋒眰娌℃湁瀹屾垚,騫朵笖娌℃湁鍑洪敊鍒欏洖鍒版湡錛?br>6.澶勭悊IO鎿嶄綔緇撴灉 渚?.涓嬈¢噸鍙犲啓鎿嶄綔榪囩▼(瀹屾垚渚嬬▼鏂規硶): 1.濉啓涓涓狾VERLAPPED緇撴瀯 2.榪涜涓嬈″啓鎿嶄綔,騫舵寚瀹氶噸鍙犳搷浣滃弬鏁?涓婇潰鐨凮VERLAPPED緇撴瀯鍙橀噺鐨勬寚閽?,騫舵寚瀹氬畬鎴愪緥紼?br>3.鍋氬叾瀹冧簨(濡傛洿鏂扮晫闈? 4.褰撳畬鎴愪緥紼嬭璋冪敤璇存槑IO鎿嶄綔宸茬粡瀹屾垚鎴栧嚭閿?鐜板湪鍙互瀵規搷浣滅粨鏋滆繘琛屽鐞嗕簡 濡傛灉浣犲凡緇忕悊瑙d笂闈㈢殑姒傚康,灝卞凡緇忓緢鎺ヨ繎IO瀹屾垚绔彛浜?褰撶劧榪欏彧鏄緢甯歌鐨勯噸鍙犳搷浣滃畠宸茬粡闈炲父楂樻晥,浣嗗鏋滃啀緇撳悎澶氱嚎紼嬪涓涓狥ile鎴栨槸Socket榪涜閲嶅彔IO鎿嶄綔灝變細闈炲父澶嶆潅,閫氬父紼嬪簭鍛樺緢闅炬妸鎻¤繖縐嶅鏉傚害.瀹屾垚绔彛鍙互璇村氨鏄負浜嗗厖鍒嗗彂鎸ュ綰跨▼鍜岄噸鍙營O鎿嶄綔鐩哥粨鍚堢殑鎬ц兘鑰岃璁$殑.寰堝浜洪兘璇村畠澶嶆潅,鍏跺疄濡傛灉浣犺嚜宸卞疄鐜頒竴涓綰跨▼鐨勫涓涓狥ile鎴栨槸Socket榪涜閲嶅彔IO鎿嶄綔鐨勭▼搴?娉ㄦ剰鏄涓嚎紼嬪涓涓狧ANDLE鎴朣OCKET榪涜閲嶅彔IO鎿嶄綔,鑰屼笉鏄惎涓涓嚎紼嬪涓涓狧ANDLE榪涜閲嶅彔IO鎿嶄綔)灝變細鍙戠幇瀹屾垚绔彛瀹為檯涓婄畝鍖栦簡澶氱嚎紼嬮噷浣跨敤閲嶅彔IO鐨勫鏉傚害,騫朵笖鎬ц兘鏇撮珮,鎬ц兘楂樺湪鍝?涓嬮潰榪涜璇存槑. 鎴戜滑鍙兘鍐欒繃榪欐牱鐨勬湇鍔$紼嬪簭: 渚?.涓葷▼搴? 1.鐩戝惉涓涓鍙?br>2.絳夊緟榪炴帴 3.褰撴湁榪炴帴鏉ユ椂 4.鍚竴涓嚎紼嬪榪欎釜瀹㈡埛绔繘琛屽鐞?br>5.鍥炲埌2 鏈嶅姟綰跨▼: 1.璇誨鎴風璇鋒眰 2.濡傛灉瀹㈡埛绔笉鍐嶆湁璇鋒眰,鎵ц6 3.澶勭悊璇鋒眰 4.榪斿洖鎿嶄綔緇撴灉 5.鍥炲埌1 6.閫鍑虹嚎紼?br> 榪欐槸涓縐嶆渶綆鍗曠殑緗戠粶鏈嶅姟鍣ㄦā鍨?鎴戜滑鎶婂畠浼樺寲涓涓?br> 渚?.涓葷▼搴? 1.寮涓涓嚎紼嬫睜,閲岄潰鏈夋満鍣ㄨ兘鎵垮彈鐨勬渶澶х嚎紼嬫暟涓嚎紼?綰跨▼閮藉浜庢寕璧?suspend)鐘舵?br>1.鐩戝惉涓涓鍙?br>2.絳夊緟榪炴帴 3.褰撴湁榪炴帴鏉ユ椂 4.浠庣嚎紼嬫睜閲孯esume涓涓嚎紼嬪榪欎釜瀹㈡埛绔繘琛屽鐞?br>5.鍥炲埌2 鏈嶅姟綰跨▼涓庝緥3妯″瀷閲岀殑鐩稿悓,鍙槸褰撶嚎紼嬪鐞嗗畬瀹㈡埛绔墍鏈夎姹傚悗,涓嶆槸閫鍑鴻屾槸鍥炲埌綰跨▼姹?鍐嶆鎸傝搗璁╁嚭CPU鏃墮棿,騫剁瓑寰呬負涓嬩竴涓鎴鋒満鏈嶅姟.褰撶劧鍦ㄦ鏈熼棿綰跨▼浼氬洜涓篒O鎿嶄綔(鏈嶅姟綰跨▼鐨勭1,5鎿嶄綔,涔熻榪樻湁鍏跺畠闃誨鎿嶄綔)鎸傝搗鑷繁,浣嗕笉浼氬洖鍒扮嚎紼嬫睜,涔熷氨鏄瀹冧竴嬈″彧鑳戒負涓涓鎴風鏈嶅姟. 榪欏彲鑳芥槸浣犺兘鎯沖埌鐨勬渶楂樻晥鐨勬湇鍔$妯″瀷浜嗗惂!瀹冧笌絎竴涓湇鍔$妯″瀷鐩告瘮灝戜簡寰堝涓敤鎴鋒佸埌鍐呮牳鎬佺殑CONTEXT Switch,鍙嶆槧涔熸洿鍔犲揩閫?涔熻浣犲彲鑳借寰楄繖寰堝井涓嶈凍閬?榪欒鏄庝綘緙哄皯瀵瑰ぇ瑙勬ā楂樻ц兘鏈嶅姟鍣ㄧ▼搴?姣斿緗戞父鏈嶅姟绔?鐨勮璇?濡傛灉浣犵殑鏈嶅姟绔▼搴忚瀵瑰嚑鍗冧竾涓鎴風榪涜鏈嶅姟鍛?榪欎篃鏄井杞疻indows NT寮鍙戠粍鍦∟T 5浠ヤ笂鐨勭郴緇熶腑娣誨姞綰跨▼姹犵殑鍘熷洜. 鎬濊冧竴涓嬩粈涔堟牱鐨勬ā鍨嬪彲浠ヨ涓涓嚎紼嬩負澶氫釜瀹㈡埛绔湇鍔″憿!閭e氨瑕佽煩鍑烘瘡鏉ヤ竴涓繛鎺ュ惎綰跨▼涓哄叾鏈嶅姟鐨勫浐瀹氭濈淮妯″紡,鎴戜滑鎶婄嚎紼嬫湇鍔$殑鏈灝忓崟鍏冨垎鍓蹭負鍗曠嫭鐨勮鎴栧啓鎿嶄綔(娉ㄦ剰鏄鎴栧啓涓嶆槸璇誨拰鍐?,鑰屼笉鏄竴涓鎴風浠庤繛鎺ュ埌鏂紑鏈熼棿鐨勬墍鏈夎鍐欐搷浣?姣忎釜綰跨▼閮戒嬌鐢ㄩ噸鍙營O榪涜璇誨啓鎿嶄綔,鎶曢掍簡璇誨啓璇鋒眰鍚庣嚎紼嬪洖鍒扮嚎紼嬫睜,絳夊緟涓哄叾瀹冨鎴鋒満鏈嶅姟,褰撴搷浣滃畬鎴愭垨鍑洪敊鏃跺啀鍥炴潵澶勭悊鎿嶄綔緇撴灉,鐒跺悗鍐嶅洖鍒扮嚎紼嬫睜. 鐪嬬湅榪欐牱鐨勬湇鍔″櫒妯″瀷: 渚?.涓葷▼搴? 1.寮涓涓嚎紼嬫睜,閲岄潰鏈夋満鍣ㄥ唴CPU涓暟涓ゅ嶇殑綰跨▼,綰跨▼閮藉浜庢寕璧?suspend)鐘舵?瀹冧滑鍦ㄩ兘絳夊鐞嗕竴嬈¢噸鍙營O鎿嶄綔鐨勫畬鎴愮粨鏋?br>1.鐩戝惉涓涓鍙?br>2.絳夊緟榪炴帴 3.褰撴湁榪炴帴鏉ユ椂 4.鎶曢掍竴涓噸鍙犺鎿嶄綔璇誨彇鍛戒護 5.鍥炲埌2 鏈嶅姟綰跨▼: 1.濡傛灉璇誨畬鎴?鍒欏鐞嗚鍙栫殑鍐呭(濡侶TTP GET鍛戒護),鍚﹀垯鎵ц3 2.鎶曢掍竴涓噸鍙犲啓鎿嶄綔(濡傝繑鍥濰TTP GET鍛戒護闇瑕佺殑緗戦〉) 3.濡傛灉鏄竴涓啓鎿嶄綔瀹屾垚,鍙互鍐嶆姇閫掍竴涓噸鍙犺鎿嶄綔,璇誨彇瀹㈡埛鏈虹殑涓嬩竴涓姹?鎴栬呮槸鍏抽棴榪炴帴(濡侶TTP鍗忚閲屾瘡鍙戝畬涓涓綉欏靛氨鏂紑) 4.鍙栧緱涓嬩竴涓噸鍙營O鎿嶄綔緇撴灉,濡傛灉IO鎿嶄綔娌℃湁瀹屾垚鎴栨病鏈塈O鎿嶄綔鍒欏洖鍒扮嚎紼嬫睜 鍋囪榪欐槸涓涓猈EB鏈嶅姟鍣ㄧ▼搴?鍙互鐪嬪埌宸ヤ綔鑰呯嚎紼嬫槸浠ヨ鎴栧啓涓烘渶灝忕殑宸ヤ綔鍗曞厓榪愯鐨?鍦ㄤ富紼嬪簭閲岄潰榪涜浜嗕竴嬈¢噸鍙犺鎿嶄綔 褰撹鎿嶄綔瀹屾垚鏃朵竴涓嚎紼嬫睜涓殑涓涓伐浣滆呯嚎紼嬭嬋媧誨彇寰椾簡鎿嶄綔緇撴灉,澶勭悊GET鎴朠OST鍛戒護,鐒跺悗鍙戦佷竴涓綉欏靛唴瀹?鍙戦佷篃鏄竴涓噸鍙犳搷浣?鐒跺悗澶勭悊瀵瑰叾瀹冨鎴鋒満鐨処O鎿嶄綔緇撴灉,濡傛灉娌℃湁鍏跺畠鐨勪笢瑗塊渶瑕佸鐞嗘椂鍥炲埌綰跨▼姹犵瓑寰?鍙互鐪嬪埌浣跨敤榪欑妯″瀷鍙戦佸拰鎺ユ敹鍙互鏄篃鍙互涓嶆槸涓涓嚎紼? 褰撳彂閫佹搷浣滃畬鎴愭椂,綰跨▼姹犱腑鐨勪竴涓伐浣滆呯嚎紼嬫睜嬋媧?瀹冨叧闂繛鎺?HTTP鍗忚),鐒跺悗澶勭悊鍏跺畠鐨処O鎿嶄綔緇撴灉,濡傛灉娌℃湁鍏跺畠鐨勪笢瑗塊渶瑕佸鐞嗘椂鍥炲埌綰跨▼姹犵瓑寰? 鐪嬬湅鍦ㄨ繖鏍風殑妯″瀷涓竴涓嚎紼嬫庝箞涓哄涓鎴風鏈嶅姟,鍚屾牱鏄ā鎷熶竴涓猈EB鏈嶅姟鍣ㄤ緥瀛? 鍋囧鐜板湪緋葷粺涓湁涓や釜綰跨▼,ThreadA,ThreadB瀹冧滑鍦ㄩ兘絳夊鐞嗕竴嬈¢噸鍙營O鎿嶄綔鐨勫畬鎴愮粨鏋?br> 褰撲竴涓鎴鋒満ClientA榪炴帴鏉ユ椂涓葷▼搴忔姇閫掍竴涓噸鍙犺鎿嶄綔,鐒跺悗絳夊緟涓嬩竴涓鎴鋒満榪炴帴,褰撹鎿嶄綔瀹屾垚鏃禩hreadA琚縺媧?瀹冩敹鍒頒竴涓狧TTP GET鍛戒護,鐒跺悗ThreadA浣跨敤閲嶅彔鍐欐搷浣滃彂閫佷竴涓綉欏電粰ClientA,鐒跺悗绔嬪嵆鍥炲埌綰跨▼姹犵瓑寰呭鐞嗕笅涓涓狪O鎿嶄綔緇撴灉,榪欐椂鍙戦佹搷浣滆繕娌℃湁瀹屾垚,鍙堟湁涓涓鎴鋒満ClientB榪炴帴鏉?涓葷▼搴忓啀鎶曢掍竴涓噸鍙犺鎿嶄綔,褰撹鎿嶄綔瀹屾垚鏃禩hreadA(褰撶劧涔熷彲鑳芥槸ThreadB)鍐嶆琚縺媧?瀹冮噸澶嶅悓鏍鋒楠?鏀跺埌涓涓狦ET鍛戒護,浣跨敤閲嶅彔鍐欐搷浣滃彂閫佷竴涓綉欏電粰ClientB,榪欐瀹冩病鏈夋潵寰楀強鍥炲埌綰跨▼姹犳椂,鍙堟湁涓涓繛鎺lientC榪炲叆,涓葷▼搴忓啀鎶曢掍竴涓噸鍙犺鎿嶄綔,璇繪搷浣滃畬鎴愭椂ThreadB琚縺媧?鍥犱負ThreadA榪樻病鏈夊洖鍒扮嚎紼嬫睜)瀹冩敹鍒頒竴涓狧TTP GET鍛戒護,鐒跺悗ThreadB浣跨敤閲嶅彔鍐欐搷浣滃彂閫佷竴涓綉欏電粰ClientC,鐒跺悗ThreadB鍥炲埌綰跨▼姹?榪欐椂ThreadA涔熷洖鍒頒簡綰跨▼姹? 鍙互鎯寵薄鐜板湪鏈変笁涓寕璧風殑鍙戦佹搷浣滃垎鍒槸ThreadA鍙戦佺粰ClientA鍜孋lientB鐨勭綉欏?浠ュ強ThreadB鍙戦佺粰ClientC鐨勭綉欏?瀹冧滑鐢辨搷浣滅郴緇熷唴鏍告潵澶勭悊.ThreadA鍜孴hreadB鐜板湪宸茬粡鍥炲埌綰跨▼姹?鍙互緇х畫涓哄叾瀹冧換浣曞鎴風鏈嶅姟. 褰撳ClientA鐨勯噸鍙犲啓鎿嶄綔宸茬粡瀹屾垚,ThreadA(涔熷彲浠ユ槸ThreadB)鍙堣嬋媧誨畠鍏抽棴涓嶤lientA榪炴帴,浣嗚繕娌℃湁鍥炲埌綰跨▼姹?涓庢鍚屾椂鍙戦佺粰ClientB鐨勯噸鍙犲啓鎿嶄綔涔熷畬鎴?ThreadB琚縺媧?鍥犱負ThreadA榪樻病鏈夊洖鍒扮嚎紼嬫睜)瀹冨叧闂笌ClientB鐨勮繛鎺?鐒跺悗鍥炲埌綰跨▼姹?榪欐椂ClientC鐨勫啓鎿嶄綔涔熷畬鎴?ThreadB鍐嶆琚縺媧?鍥犱負ThreadA榪樻槸娌℃湁鍥炲埌綰跨▼姹?,瀹冨啀鍏抽棴涓嶤lientC鐨勮繛鎺?榪欐椂ThreadA鍥炲埌綰跨▼姹?ThreadB涔熷洖鍒扮嚎紼嬫睜.榪欐椂瀵逛笁涓鎴風鐨勬湇鍔″叏閮ㄥ畬鎴?鍙互鐪嬪埌鍦ㄦ暣涓湇鍔¤繃紼嬩腑,"寤虹珛榪炴帴","璇繪暟鎹?,"鍐欐暟鎹?鍜?鍏抽棴榪炴帴"絳夋搷浣滄槸閫昏緫涓婅繛緇屽疄闄呬笂鍒嗗紑鐨? 鍒扮幇鍦ㄤ負姝袱涓嚎紼嬪鐞嗕簡涓夋璇繪搷浣滃拰涓夋鍐欐搷浣?鍦ㄨ繖浜涜鍐欐搷浣滆繃紼嬩腑鎵鍑虹幇鐨勭姸鎬佹満(state machine)鏄瘮杈冨鏉傜殑,鎴戜滑妯℃嫙鐨勬槸緇忚繃鎴戠畝鍖栬繃鐨?瀹為檯涓婄殑鐘舵佽姣旇繖涓繕瑕佸鏉傚緢澶?鐒惰岃繖鏍風殑鏈嶅姟绔ā鍨嬪湪瀹㈡埛绔姹傝秺澶氭椂涓庡墠涓や釜妯″瀷鐩告瘮鐨勬ц兘瓚婇珮.鑰屼嬌鐢ㄥ畬鎴愮鍙f垜浠彲浠ュ緢瀹規槗瀹炵幇榪欐牱鐨勬湇鍔″櫒妯″瀷. 寰蔣鐨処IS WEB鏈嶅姟鍣ㄥ氨鏄嬌鐢ㄨ繖鏍風殑鏈嶅姟绔ā鍨?寰堝浜鴻浠涔堥樋甯曞鏈嶅姟鍣ㄦ瘮IIS鐨勬ц兘濂戒粈涔堜粈涔堢殑鎴戣〃紺烘鐤?闄ら潪闃垮笗濂囨湇鍔″櫒鍙互灝嗙嚎紼嬪垎鍓叉垚,涓烘洿灝忕殑鍗曞厓鏈嶅姟,鎴戣寰椾笉澶彲鑳?榪欑瀹屾垚绔彛妯″瀷宸茬粡灝嗗崟涓鎴栧啓鎿嶄綔浣滀負鏈灝忕殑鏈嶅姟鍗曞厓,鎴戣寰楀湪鐩稿悓鏈哄櫒閰嶇疆鐨勬儏鍐典笅IIS鐨勬ц兘瑕佽繙榪滈珮浜庡叾瀹僕EB鏈嶅姟鍣?榪欎篃鏄粠瀹炵幇鏈虹悊涓婃潵鍒嗘瀽鐨?濡傛灉鍑虹幇鎬ц兘涓婄殑宸埆鍙兘鏄湪涓嶅悓鐨勬搷浣滅郴緇熶笂,涔熻Linux鐨勫唴鏍告瘮Windows鐨勮濂?鏈変漢鐪熺殑鐮旂┒榪囧悧?榪樻槸澶у涓璧峰湪鐐掍綔鍟? 瀵逛簬鐘舵佹満姒傚康,鍦ㄥ緢澶氭柟闈㈤兘鐢ㄥ埌,TCPIP涓湁,緙栬瘧鍘熺悊涓湁,OpengGL涓湁絳夌瓑,鎴戠殑紱繪暎鏁板涓嶅ソ(鎴戞槸浼氳涓撲笟涓嶅榪欎釜),涓嶈繃榪樻槸鎼炴噦浜嗕簺,鎴戞兂濡傛灉浣犲鑺變簺鏃墮棿鐪?榪樻槸鍙互鎼炴噦鐨?鏈鍚庢槸涓涓畝鍗曠殑鏂囦歡浼犺緭鏈嶅姟鍣ㄧ▼搴忎唬鐮?鍙敤浜嗕袱涓嚎紼?鎴戠殑鏈哄櫒閲屽彧鏈変竴鍧桟PU)灝卞彲浠ユ湇鍔″涓鎴風.鎴戣皟璇曟椂鐢ㄥ畠鍚屾椂涓?涓猲c瀹㈡埛绔彁渚涙枃浠朵笅杞芥湇鍔¢兘娌℃湁闂,褰撶劧鏇村涔熶笉浼氭湁闂,鍙槸鐣ヤ負浣跨敤浜嗕竴涓婲T 5鐨勭嚎紼嬫睜鍜屽畬鎴愮鍙f妧鏈氨鍙互鏈夎繖鏍烽珮鐨勬ц兘,鏇翠笉鐢ㄨIIS鐨勬ц兘鍜? 甯屾湜澶у涓嶈闄峰湪榪欎釜紼嬪簭鐨勬鏋朵腑,Ctrl+C,Ctrl+V娌℃湁浠涔堟剰涔?瑕佺悊瑙e畠鐨勫疄璐?紼嬪簭浣跨敤Visual C++ 6.0 SP5+2003 Platform SDK緙栬瘧閫氳繃,鍦╓indows XP Professional涓嬭皟璇曡繍琛岄氳繃.紼嬪簭榪愯鐨勬渶浣庤姹傛槸Windows 2000鎿嶄綔緋葷粺. /******************************************************************** created: 2005/12/24 created: 24:12:2005 20:25 modified: 2005/12/24 filename: d:\vcwork\iocomp\iocomp.cpp file path: d:\vcwork\iocomp file base: iocomp file ext: cpp author: kruglinski(kruglinski_at_gmail_dot_com) purpose: 鍒╃敤瀹屾垚绔彛鎶鏈疄鐜扮殑楂樻ц兘鏂囦歡涓嬭澆鏈嶅姟紼嬪簭 *********************************************************************/ #define _WIN32_WINNT 0x0500 #include <cstdlib> #include <clocale> #include <ctime> #include <iostream>//涓浣跨敤杈撳叆杈撳嚭嫻佺▼搴忛】鏃跺澶?0K #include <vector> #include <algorithm> #include <winsock2.h> #include <mswsock.h> using namespace std; #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"mswsock.lib") const int MAX_BUFFER_SIZE=1024; const int PRE_SEND_SIZE=1024; const int QUIT_TIME_OUT=3000; const int PRE_DOT_TIMER=QUIT_TIME_OUT/80; typedef enum{IoTransFile,IoSend,IoRecv,IoQuit} IO_TYPE; typedef struct { SOCKET hSocket; SOCKADDR_IN ClientAddr; }PRE_SOCKET_DATA,*PPRE_SOCKET_DATA; typedef struct { OVERLAPPED oa; WSABUF DataBuf; char Buffer[MAX_BUFFER_SIZE]; IO_TYPE IoType; }PRE_IO_DATA,*PPRE_IO_DATA; typedef vector<PPRE_SOCKET_DATA> SocketDataVector; typedef vector<PPRE_IO_DATA> IoDataVector; SocketDataVector gSockDataVec; IoDataVector gIoDataVec; CRITICAL_SECTION csProtection; char* TimeNow(void) { time_t t=time(NULL); tm *localtm=localtime(&t); static char timemsg[512]={0}; strftime(timemsg,512,"%Z: %B %d %X,%Y",localtm); return timemsg; } BOOL TransFile(PPRE_IO_DATA pIoData,PPRE_SOCKET_DATA pSocketData,DWORD dwNameLen) { //榪欎竴鍙ユ槸涓簄c鍋氱殑,浣犲彲浠ヤ慨鏀瑰畠 pIoData->Buffer[dwNameLen-1]='\0'; HANDLE hFile=CreateFile(pIoData->Buffer,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); BOOL bRet=FALSE; if(hFile!=INVALID_HANDLE_VALUE) { cout<<"Transmit File "<<pIoData->Buffer<<" to client"<<endl; pIoData->IoType=IoTransFile; memset(&pIoData->oa,0,sizeof(OVERLAPPED)); *reinterpret_cast<HANDLE*>(pIoData->Buffer)=hFile; TransmitFile(pSocketData->hSocket,hFile,GetFileSize(hFile,NULL),PRE_SEND_SIZE,reinterpret_cast<LPOVERLAPPED>(pIoData),NULL,TF_USE_SYSTEM_THREAD); bRet=WSAGetLastError()==WSA_IO_PENDING; } else cout<<"Transmit File "<<"Error:"<<GetLastError()<<endl; return bRet; } DWORD WINAPI ThreadProc(LPVOID IocpHandle) { DWORD dwRecv=0; DWORD dwFlags=0; HANDLE hIocp=reinterpret_cast<HANDLE>(IocpHandle); DWORD dwTransCount=0; PPRE_IO_DATA pPreIoData=NULL; PPRE_SOCKET_DATA pPreHandleData=NULL; while(TRUE) { if(GetQueuedCompletionStatus(hIocp,&dwTransCount, reinterpret_cast<LPDWORD>(&pPreHandleData), reinterpret_cast<LPOVERLAPPED*>(&pPreIoData),INFINITE)) { if(0==dwTransCount&&IoQuit!=pPreIoData->IoType) { cout<<"Client:" <<inet_ntoa(pPreHandleData->ClientAddr.sin_addr) <<":"<<ntohs(pPreHandleData->ClientAddr.sin_port) <<" is closed"<<endl; closesocket(pPreHandleData->hSocket); EnterCriticalSection(&csProtection); IoDataVector::iterator itrIoDelete=find(gIoDataVec.begin(),gIoDataVec.end(),pPreIoData); gIoDataVec.erase(itrIoDelete); SocketDataVector::iterator itrSockDelete=find(gSockDataVec.begin(),gSockDataVec.end(),pPreHandleData); gSockDataVec.erase(itrSockDelete); LeaveCriticalSection(&csProtection); delete *itrIoDelete; delete *itrSockDelete; continue; } switch(pPreIoData->IoType){ case IoTransFile: cout<<"Client:" <<inet_ntoa(pPreHandleData->ClientAddr.sin_addr) <<":"<<ntohs(pPreHandleData->ClientAddr.sin_port) <<" Transmit finished"<<endl; CloseHandle(*reinterpret_cast<HANDLE*>(pPreIoData->Buffer)); goto LRERECV; case IoSend: cout<<"Client:" <<inet_ntoa(pPreHandleData->ClientAddr.sin_addr) <<":"<<ntohs(pPreHandleData->ClientAddr.sin_port) <<" Send finished"<<endl; LRERECV: pPreIoData->IoType=IoRecv; pPreIoData->DataBuf.len=MAX_BUFFER_SIZE; memset(&pPreIoData->oa,0,sizeof(OVERLAPPED)); WSARecv(pPreHandleData->hSocket,&pPreIoData->DataBuf,1, &dwRecv,&dwFlags, reinterpret_cast<LPWSAOVERLAPPED>(pPreIoData),NULL); break; case IoRecv: cout<<"Client:" <<inet_ntoa(pPreHandleData->ClientAddr.sin_addr) <<":"<<ntohs(pPreHandleData->ClientAddr.sin_port) <<" recv finished"<<endl; pPreIoData->IoType=IoSend; if(!TransFile(pPreIoData,pPreHandleData,dwTransCount)) { memset(&pPreIoData->oa,0,sizeof(OVERLAPPED)); strcpy(pPreIoData->DataBuf.buf,"File transmit error!\r\n"); pPreIoData->DataBuf.len=strlen(pPreIoData->DataBuf.buf); WSASend(pPreHandleData->hSocket,&pPreIoData->DataBuf,1, &dwRecv,dwFlags, reinterpret_cast<LPWSAOVERLAPPED>(pPreIoData),NULL); } break; case IoQuit: goto LQUIT; default: ; } } } LQUIT: return 0; } HANDLE hIocp=NULL; SOCKET hListen=NULL; BOOL WINAPI ShutdownHandler(DWORD dwCtrlType) { PRE_SOCKET_DATA PreSockData={0}; PRE_IO_DATA PreIoData={0}; PreIoData.IoType=IoQuit; if(hIocp) { PostQueuedCompletionStatus(hIocp,1, reinterpret_cast<ULONG_PTR>(&PreSockData), reinterpret_cast<LPOVERLAPPED>(&PreIoData)); cout<<"Shutdown at "<<TimeNow()<<endl<<"wait for a moment please"<<endl; //璁╁嚭CPU鏃墮棿,璁╃嚎紼嬮鍑?br> for(int t=0;t<80;t+=1) { Sleep(PRE_DOT_TIMER); cout<<"."; } CloseHandle(hIocp); } int i=0; for(;i<gSockDataVec.size();i++) { PPRE_SOCKET_DATA pSockData=gSockDataVec[i]; closesocket(pSockData->hSocket); delete pSockData; } for(i=0;i<gIoDataVec.size();i++) { PPRE_IO_DATA pIoData=gIoDataVec[i]; delete pIoData; } DeleteCriticalSection(&csProtection); if(hListen) closesocket(hListen); WSACleanup(); exit(0); return TRUE; } LONG WINAPI MyExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo) { ShutdownHandler(0); return EXCEPTION_EXECUTE_HANDLER; } u_short DefPort=8182; int main(int argc,char **argv) { if(argc==2) DefPort=atoi(argv[1]); InitializeCriticalSection(&csProtection); SetUnhandledExceptionFilter(MyExceptionFilter); SetConsoleCtrlHandler(ShutdownHandler,TRUE); hIocp=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0); WSADATA data={0}; WSAStartup(0x0202,&data); hListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET==hListen) { ShutdownHandler(0); } SOCKADDR_IN addr={0}; addr.sin_family=AF_INET; addr.sin_port=htons(DefPort); if(bind(hListen,reinterpret_cast<PSOCKADDR>(&addr), sizeof(addr))==SOCKET_ERROR) { ShutdownHandler(0); } if(listen(hListen,256)==SOCKET_ERROR) ShutdownHandler(0); SYSTEM_INFO si={0}; GetSystemInfo(&si); si.dwNumberOfProcessors<<=1; for(int i=0;i<si.dwNumberOfProcessors;i++) { QueueUserWorkItem(ThreadProc,hIocp,WT_EXECUTELONGFUNCTION); } cout<<"Startup at "<<TimeNow()<<endl <<"work on port "<<DefPort<<endl <<"press CTRL+C to shutdown"<<endl<<endl<<endl; while(TRUE) { int namelen=sizeof(addr); memset(&addr,0,sizeof(addr)); SOCKET hAccept=accept(hListen,reinterpret_cast<PSOCKADDR>(&addr),&namelen); if(hAccept!=INVALID_SOCKET) { cout<<"accept a client:"<<inet_ntoa(addr.sin_addr)<<":"<<ntohs(addr.sin_port)<<endl; PPRE_SOCKET_DATA pPreHandleData=new PRE_SOCKET_DATA; pPreHandleData->hSocket=hAccept; memcpy(&pPreHandleData->ClientAddr,&addr,sizeof(addr)); CreateIoCompletionPort(reinterpret_cast<HANDLE>(hAccept), hIocp,reinterpret_cast<DWORD>(pPreHandleData),0); PPRE_IO_DATA pPreIoData=new(nothrow) PRE_IO_DATA; if(pPreIoData) { EnterCriticalSection(&csProtection); gSockDataVec.push_back(pPreHandleData); gIoDataVec.push_back(pPreIoData); LeaveCriticalSection(&csProtection); memset(pPreIoData,0,sizeof(PRE_IO_DATA)); pPreIoData->IoType=IoRecv; pPreIoData->DataBuf.len=MAX_BUFFER_SIZE; pPreIoData->DataBuf.buf=pPreIoData->Buffer; DWORD dwRecv=0; DWORD dwFlags=0; WSARecv(hAccept,&pPreIoData->DataBuf,1, &dwRecv,&dwFlags, reinterpret_cast<WSAOVERLAPPED*>(pPreIoData),NULL); } else { delete pPreHandleData; closesocket(hAccept); } } } return 0; } 鍙傝冭祫鏂? 銆奙SDN 2001銆?br>銆奧indows 緗戠粶緙栫▼銆?br>銆奧indows 鏍稿績緙栫▼銆?br>銆奣CP/IP璇﹁В銆?/font>
]]> socket緙栫▼鈥旀妧鏈疄鐜? http://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41375.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Thu, 17 Jan 2008 14:22:00 GMT http://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41375.html http://www.shnenglu.com/amyvmiwei/comments/41375.html http://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41375.html#Feedback 0 http://www.shnenglu.com/amyvmiwei/comments/commentRss/41375.html http://www.shnenglu.com/amyvmiwei/services/trackbacks/41375.html 浠涔堟槸socket錛焥ocket灝辨槸...錛屾垜鍦ㄨ繖閲屽氨涓嶆妱涔︿簡錛屾湁鍏磋叮鐨勫悓浠佸幓鏌ユ煡涔﹀惂銆?br>涓嶈繃榪樿璇翠竴鍙ワ紝socket灝辨槸涓嶅悓榪涚▼涔嬮棿鐨勪竴縐嶉氫俊鏂瑰紡銆傚氨璞℃墦鐢佃瘽鏄湅鍙嬩箣闂寸殑涓縐嶉氫俊鏂瑰紡鏄竴鏍楓備釜浜虹悊瑙o細鎵璋?#8220;閫氫俊”錛屽氨鏄浉浜掍箣闂村彂閫佹暟鎹傛湁浜虹悊瑙ocket鏄笉鍚岃綆楁満涔嬮棿鐨勪竴縐嶉氫俊鏂?br>寮忥紝榪欐槸涓嶇‘鍒囩殑銆備袱涓繘紼嬶紝涓嶇鏄繍琛屽湪鍚屼竴鍙拌綆楁満涓婏紝榪樻槸榪愯鍦ㄤ笉鍚岃綆楁満涓婏紝閮藉彲閫氳繃 socket鎶鏈繘琛岄氫俊銆?br> socket濂楁帴瀛楃殑浣跨敤闇瑕佹湁緗戝崱鐨勬敮鎸侊紝鎵浠ocket涓鑸兘琚敤鏉ュ湪涓嶅悓鏈哄櫒涔嬮棿閫氫俊錛岃屽鏋滃湪鍚屼竴鍙拌綆楁満涓婄殑涓や釜榪涚▼榪涜閫氫俊錛岄氬父閲囩敤鏁堢巼鏇撮珮鐨勫叡浜唴瀛樻妧鏈潵瀹炵幇銆?br> 涓や釜榪涚▼涔嬮棿榪涜閫氳錛屽氨闇瑕佷袱涓繘紼嬪悓鏃墮兘鍦ㄨ繍琛屼簡錛堝簾璇濓級錛屽湪鍏蜂綋瀹炵幇涓紝涓や釜榪涚▼鎴戜滑閫氬父瑕佸尯鍒寰咃紝涓涓繘紼嬩笓闂ㄧ瓑寰呭彟涓涓繘紼嬬粰鑷繁鍙戞秷鎭紝鏀跺埌娑堟伅鍚庤繘琛屽鐞嗭紝鍦ㄦ妸澶勭悊緇撴灉鍙戦佸洖鍘匯傛垜浠妸涓撻棬澶勭悊娑堟伅銆佹彁渚涙湇鍔$殑榪涚▼縐頒負鏈嶅姟鍣ㄧ錛屾妸鍙戦佹秷鎭佽姹傚鐞嗙殑榪涚▼縐頒負瀹㈡埛绔傛諱綋榪囩▼灝辨槸瀹㈡埛绔彂閫佷竴涓秷鎭粰鏈嶅姟鍣ㄧ錛屾湇鍔″櫒绔繘紼嬫敹鍒版秷鎭繘琛屽鐞嗭紝鎶婂鐞嗙粨鏋滃彂閫佺粰瀹㈡埛绔傛仼錛屽氨鏄繖鏍楓?br> 榪樻湁涓涓棶棰橈紝濡傛灉鎴戠幇鍦ㄦ湁涓涓繘紼嬭璺熷彟涓鍙拌綆楁満涓婄殑鏌愪釜榪涚▼榪涜socket閫氫俊錛岄偅鍦ㄦ垜榪欎釜榪涚▼涓浣曟寚瀹氬彟涓涓繘紼嬪憿錛熻繖閲岃繕闇瑕佽涓涓嬪彟涓涓蹇碘斺旂鍙o紝濡傛灉鎶婃搷浣滅郴緇熸瘮浣滀竴搴ф埧瀛愮殑璇濓紝閭g鍙e氨鏄埧瀛愮殑紿楀彛錛屾槸緋葷粺澶栫晫鍚岀郴緇熷唴閮ㄨ繘琛岄氫俊鐨勯氶亾銆傚湪socket瀹炵幇涓紝鎴戜滑涓嶈繘琛屽彟涓涓繘紼嬬殑鎸囧畾錛岃屾槸鎸囧畾鍙戦佹秷鎭垨鎺ユ敹娑堟伅鐨勭鍙e彿銆傛瘮濡傝鐜板湪榪涚▼A瑕佺粰榪涚▼B鍙戞秷鎭紝鎴戜滑浼氭妸娑堟伅鍙戦佸埌榪涚▼B鎵榪愯鐨勮綆楁満鐨勭鍙涓婏紝鑰岃繘紼婤姝ゆ椂姝e湪鐩戣绔彛N錛岃繖鏍瘋繘紼婤灝辮兘鏀跺埌榪涚▼A鍙戦佹潵鐨勬暟鎹紝鍚屾牱榪涚▼B涔熸妸娑堟伅鍙戦佸埌璇ョ鍙d笂錛岃繘紼婣涔熻兘浠庤绔彛鏀跺埌榪涚▼B鍙戦佹潵鐨勬暟鎹紝褰撶劧錛岃繖闇瑕佸鎴風鍜屾湇鍔″櫒绔叧浜庣鍙e彿榪涜涓涓害瀹氾紝鍗沖叡鍚屾搷浣滃悓涓涓鍙c傚鏋滃鎴風鎶婃秷鎭彂閫佸埌绔彛N1涓婏紝鑰屾湇鍔″櫒绔洃瑙嗙殑鏄鍙2錛岄偅閫氫俊涓瀹氫笉鑳芥垚鍔熴傜鍙e彿鏈澶т負65535錛屼笉鑳芥瘮榪欎釜鍐嶅ぇ浜嗭紝浣嗗湪鎴戜滑鑷繁鐨勭▼搴忎腑灝介噺涓嶈鐢ㄥ皬浜?024鐨勭鍙e彿錛屽皬浜?024鐨勭鍙eソ寰堝閮借緋葷粺浣跨敤浜嗭紝姣斿23琚玹elnet鎵浣跨敤銆?br> socket鐨勫疄鐜版槸寰堢畝鍗曠殑錛屽彧瑕佹寜鐓т竴瀹氱殑姝ラ錛屽氨鍙┈涓婂緩绔嬩竴涓繖鏍風殑閫氫俊閫氶亾銆?br> 涓嬮潰杈冭緇嗙殑浠嬬粛鍑犱釜鏍稿績鐨勫嚱鏁幫細 SOCKET socket(int af, int type, int protocol); 鏃犺鏄鎴風榪樻槸鏈嶅姟鍣ㄧ錛屼笅闈㈣繖涓嚱鏁版槸涓瀹氳鐢ㄥ埌鐨勶紝涔熸槸鏈鍏堢敤鍒扮殑銆?br>榪欎釜鍑芥暟鏄鍛婅瘔緋葷粺錛岀粰鎴戝噯澶囧ソ涓涓猻ocket閫氶亾錛屾垜瑕佸拰鍏跺畠榪涚▼閫氫俊浜嗐傚嚱鏁扮殑榪斿洖鍊煎緢閲嶈錛屾垜浠璁頒笅鏉ワ紝瀹冭〃紺虹郴緇熶負鎴戜滑鍑嗗濂界殑榪欎釜socket閫氶亾錛屽湪浠ュ悗鐨勬瘡涓猻ocket鐩稿叧鍑芥暟涓兘浼氱敤鍒幫紝濡傛灉榪欎釜鍊肩瓑浜嶴OCKET_ERROR錛岃〃紺哄嚱鏁版墽琛屽け璐ヤ簡銆傚嚱鏁扮殑鍙傛暟鎴戜滑鍒嗗埆緇欙細PF_INET銆丼OCK_STREAM鍜孖PPROTO_TCP銆?br> int bind(SOCKET s, const sockaddr *addr, int namelen); 榪欎釜鍑芥暟鍙湁鏈嶅姟鍣ㄧ紼嬪簭浣跨敤錛屼綔鐢ㄦ槸涓庢煇涓猻ocket閫氶亾緇戝畾銆傚彲浠ョ敤榪斿洖鍊煎垽鏂鍑芥暟鎵ц緇撴灉鎬庝箞鏍鳳紝濡傛灉絳変簬SOCKET_ERROR錛岄偅灝辨槸澶辮觸浜嗐傜涓涓弬鏁皊錛屽氨鏄痵ocket()鍑芥暟鐨勮繑鍥炲鹼紱鍦ㄧ粨鏋刟ddr涓紝鎴戜滑瑕佺粰瀹氫竴涓鍙e彿錛沶amelen絳変簬緇撴瀯sockaddr鐨勫ぇ灝忋?br> int listen(SOCKET s, int backlog); 榪欎釜鍑芥暟鍙湁鏈嶅姟鍣ㄧ紼嬪簭浣跨敤錛屼綔鐢ㄦ槸鐩戝惉璇ョ鍙c傝繑鍥炲間笌bind鍑芥暟鎰忎箟涓鏍楓?br> int accept(SOCKET s, sockaddr *addr, int *addrlen); 榪欎釜鍑芥暟鍙湁鏈嶅姟鍣ㄧ紼嬪簭浣跨敤錛屼綔鐢ㄦ槸鍝嶅簲瀹㈡埛绔殑榪炴帴銆傝繑鍥炲間笌bind鍑芥暟鎰忎箟涓鏍楓?br> int connect(SOCKET s, const sockaddr *name, int namelen); 榪欎釜鍑芥暟鍙湁瀹㈡埛绔▼搴忎嬌鐢紝浣滅敤鏄妸瀹㈡埛绔拰鏌愪釜璁$畻鏈虹殑鏌愪釜绔彛寤虹珛榪炴帴銆傝繑鍥炲間笌bind鍑芥暟鎰忎箟涓鏍楓傜涓涓弬鏁皊錛屽氨鏄痵ocket()鍑芥暟鐨勮繑鍥炲鹼紱鍦ㄧ粨鏋刵ame涓紝鎴戜滑瑕佺粰瀹氫竴涓鍙e彿鍜岀洰鐨勬満鍣ㄥ悕錛沶amelen絳変簬緇撴瀯sockaddr鐨勫ぇ灝忋?br> int send(SOCKET s, char *buf, int len, int flags); int recv(SOCKET s, char *buf, int len, int flags); 榪欎袱涓嚱鏁板氨鏄彂閫佹暟鎹拰鎺ユ敹鏁版嵁錛屽鎴風鍜屾湇鍔″櫒绔▼搴忛兘鑳界敤錛屽摢涓彂閫佸摢涓帴鏀朵笉鐢ㄨ浜嗗惂錛熷懙鍛點?br>浠庡嚱鏁扮殑榪斿洖鍊煎彲浠ユ鏌ュ嚱鏁版墽琛屾槸鍚︽垚鍔熴傚弬鏁頒腑buf鏄寚鍚戝彂閫佹垨鎺ユ敹鐨勬暟鎹殑鎸囬拡錛宭en鏄暟鎹暱搴︺俧lags鎴戜滑緇欎釜0灝卞彲浠ワ紙鍏跺疄鏄垜涓嶇煡閬撳叿浣撳惈涔夛級銆?br> 鏈鍚庡氨鏄叧闂璼ocket浜嗭紝榪欎釜寰堝鏄撳繕鎺夛紝浣嗚繖涓嚱鏁板緢閲嶈錛屼竴瀹氳鐢ㄣ?br>int closesocket(SOCKET s); 濂戒簡錛屽叧閿嚱鏁板氨榪欎箞鍑犱釜錛屼笅鍥炬槸榪欏嚑涓嚱鏁扮殑鎵ц欏哄簭錛?br> client绔?service绔?br> | | v v socket() socket() | | | v | bind() | | | v | listen() | | | v | accept() 鎸傝搗錛岀洿鍒版湁瀹㈡埛绔潵榪炴帴 | | v 涓夋鎻℃墜榪囩▼ | connect() <-------------> | | | v 鍙戦佹秷鎭? v +---> send() ---------------> recv() <-------+ | | . | | | . 澶勭悊娑堟伅 | | v 鍝嶅簲娑堟伅 . | +---- recv() <--------------- send() --------+ | | v | close() ---------------> recv() | v closesocket() 涓婂浘鎴戣寰楄兘寰堝ソ鐨勮鏄庡鎴風鍜屾湇鍔″櫒绔殑榪愯杞ㄨ抗銆?br> 浣跨敤浠ヤ笂鍑犱釜鍑芥暟鍦?linux 緋葷粺涓婂氨鍙垚鍔熷緩绔嬩竴涓猻ocket閫氫俊榪炶礬錛屼絾濡傛灉鍦╳indows緋葷粺涓婏紝榪樿鐢ㄥ埌鍙︿竴涓嚱鏁幫細 int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 鍦╳indows緋葷粺涓婏紝棣栧厛瑕佹墽琛岃繖涓嚱鏁幫紝鎵浠ヨ鎶婅繖涓嚱鏁版斁鍦╯ocket()鍑芥暟鐨勫墠闈€?br> 鎴戝涓婇潰鐨勫嚱鏁拌繘琛屼簡涓浜涘皝瑁咃紝涓鴻妭鐪佺瘒騫咃紝鎴戝幓鎺夋墍鏈夋敞閲婂拰闈為噸瑕佺殑鍑芥暟錛屽湪榪欓噷鍙互鐪嬪埌鍚勪釜鍑芥暟鐨勫叿浣撶敤娉曪細 鍦?VC60 鐜涓嬭榪愯涓嬮潰鐨勫嚱鏁幫紝瑕佸寘鍚ご鏂囦歡 errno.h 鍜?winsock2.h錛岃繕鏈夛紝鍦ㄨ繛鎺ョ殑鏃跺欒榪炴帴涓妛s2_32.dll鏂囦歡銆?br> 榪欐槸澶存枃浠跺唴瀹癸細 class Socket { public: bool setup(); void close(); bool connect(string host, int port); bool listen(); int accept(); int recv(char *buf, int len); int recv(int new_fd, char *buf, int len); int send(const char *msg, int len); int send(int new_fd, const char *msg, int len); private: int _fd; }; 榪欐槸瀹炵幇鏂囦歡鍐呭錛?br>bool Socket::setup() { WSADATA wsd; _fd = WSAStartup(MAKEWORD(2,2), &wsd); if(_fd) { return false; } _fd = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (_fd == -1) { return false; } return true; } bool Socket::listen() { struct sockaddr_in my_addr; my_addr.sin_family = AF_INET; my_addr.sin_port = htons(52309); my_addr.sin_addr.s_addr = INADDR_ANY; if(::bind(_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR) { return false; } if(::listen(_fd, BACKLOG) == SOCKET_ERROR) { return false; } return true; } int Socket::accept() { int new_fd; struct sockaddr_in their_addr; int sin_size = sizeof(their_addr); printf("accepting... \n"); new_fd = ::accept(_fd, (struct sockaddr *)&their_addr, &sin_size); return new_fd == SOCKET_ERROR ? -1:new_fd; } bool Socket::connect(string host, int port) { struct hostent *_h = gethostbyname(host.c_str()); if (_h == 0) { return false; } struct in_addr *_addr = (struct in_addr *)_h->h_addr; struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_addr = *_addr; sin.sin_port = htons(port); if (::connect(_fd, (sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR) { return false; } return true; } int Socket::recv(int new_fd, char *buf, int len) { int nb = ::recv(new_fd, buf, len, 0); if (nb == -1) { printf("Error! recv.\n"); } return nb; } int Socket::recv(char *buf, int len) { return recv(_fd, buf, len); } int Socket::send(const char *msg, int len) { return send(_fd, msg, len); } int Socket::send(int new_fd, const char *msg, int len) { int nb = ::send(new_fd, msg, len, 0); if (nb == -1) { printf("Error! send.\n"); } return nb; } void Socket::close() { int trytimes = 0; while(::closesocket(_fd) && trytimes < CLOSE_TRY_TIMES) trytimes++; if(trytimes == 10) { printf("Cannot close socket!\n"); } } 濂斤紝socket綾繪槸灝佽濂戒簡錛屼笅闈㈠氨鏄粍緇囦簡錛屾湇鍔″櫒绔拰瀹㈡埛绔槸涓嶄竴鏍風殑錛屼笅闈㈠垎鍒粰鍑轟唬鐮侊紝鍒拌繖閲屽凡緇忓氨寰堢畝鍗曚簡銆?br> 瀹㈡埛绔細 int main(int argc, char **argv) { printf("socket of client is run ...\n"); Socket s; if (!s.connect("dezhi", 52309)) return 0; char *msg = "ok, send a message."; for (int i=0; i<10; i++) { s.send(msg, 20); printf("message = %s\n", msg); } s.send("q", 1); s.close(); return 0; } 鏈嶅姟鍣細 int main(int argc, char **argv) { printf("socket of service is run ...\n"); Socket s; s.listen(); int new_fd = s.accept(); char buf[8]; buf[7] = '\0'; while (1) { if (s.recv(new_fd, buf, 5) != -1) { printf("%s\n", buf); if (buf[0] == 'q') break; } } s.close(); } 涓嬮潰涓鴻繍琛岀粨鏋滐細 瀹㈡埛绔細 socket of client is run ... Socket: WSAStartup success execute. Socket: socket success execute. Socket: Establish the connection to "127.0.0.1:52309" message = ok, send a message. message = ok, send a message. message = ok, send a message. message = ok, send a message. message = ok, send a message. message = ok, send a message. message = ok, send a message. message = ok, send a message. message = ok, send a message. message = ok, send a message. Socket: Close connection to "127.0.0.1:52309" Press any key to continue 鏈嶅姟鍣ㄧ socket of service is run ... Socket: WSAStartup success execute. Socket: socket success execute. bind ok! listen ok! accepting... ok, send a message. ok, send a message. ok, send a message. ok, send a message. ok, send a message. ok, send a message. ok, send a message. ok, send a message. ok, send a message. ok, send a message. qk, send a message. Press any key to continue 灝卞埌榪欓噷鍚с俿ocket鐨勭浉鍏沖唴瀹瑰彲榪滀笉姝㈣繖浜涳紝鎴戝湪榪欓噷鍙槸緇欏ぇ瀹舵潵涓姏鐮栧紩鐜夛紝鎯蟲繁絀訛紵璺繕寰堟極闀褲傚叧浜庤緇嗙殑瀹炵幇浠g爜錛屽幓鎴戠殑銆婃簮鐮併嬩笂鎵懼惂錛屼笉鏀懼湪榪欓噷錛屾槸涓轟簡璁╃瘒騫呭皬浜涖?/font>
]]> Winsock宸ヤ綔妯″瀷 ( 杞?) http://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41365.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Thu, 17 Jan 2008 13:22:00 GMT http://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41365.html http://www.shnenglu.com/amyvmiwei/comments/41365.html http://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41365.html#Feedback 0 http://www.shnenglu.com/amyvmiwei/comments/commentRss/41365.html http://www.shnenglu.com/amyvmiwei/services/trackbacks/41365.html 棣栧厛寰楀紕娓呮鍚屾銆佸紓姝ャ侀樆濉炪侀潪闃誨鐨勬蹇點?br>鍚屾鍜屽紓姝ユ槸閽堝閫氳鐨勫伐浣滄ā寮忥紝闃誨鍜岄潪闃誨鏄寚socket鐨処/O鎿嶄綔銆?br>瀹為檯涓婂浜巗ocket錛屽彧瀛樺湪闃誨鍜岄潪闃誨錛屽悓姝ヤ笌寮傛鏄湪紼嬪簭瀹炵幇涓婃湁鎵涓嶅悓銆?br>浠ラ樆濉炵殑鏂瑰紡鎵цrecv鍑芥暟錛屽湪娌℃湁鏀跺埌鏁版嵁鍓嶏紝姝ゅ嚱鏁版槸涓嶄細榪斿洖鐨勶紝鎵浠ヨ繖寰堝鏄撴墽琛屽嚱鏁扮殑綰跨▼澶勪簬絳夊緟I/O涓婄殑鏁版嵁鐘舵侊紝鐒跺悗琚寕璧楓傞潪闃誨灝變笉涓鏍鳳紝鎵цrecv鏃跺欎笉綆℃湁娌℃湁鏁版嵁閮界珛鍗寵繑鍥烇紝鏈夋暟鎹椂榪斿洖鏁版嵁錛屾病鏁版嵁鏃惰繑鍥為敊璇傞潪闃誨鍙互甯︽潵紼嬪簭鐨勯珮鏁堬紝涔熷甫鏉ヤ簡鍐欑▼搴忎腑蹇呴』娉ㄦ剰鐨勫湴鏂癸紝闈為樆濉炴儏鍐典笅錛屽彂閫佷笌鎺ユ敹鏁版嵁鏃跺欙紝瑕佺敤鎴瘋嚜宸辯鐞嗚嚜宸辯殑緙撳啿鍖猴紝騫朵笖瑕佽褰曞彂閫佷笌鎺ュ彈鐨勪綅緗紝鍥犱負寰堝彲鑳藉彂閫佷笌鎺ュ彈鏁版嵁鐨勪換鍔′笉鑳戒竴嬈″畬鎴愶紝闇瑕佸嬈¤皟鐢╯end鍜宺ecv鎵嶅彲浠ュ畬鎴愩?br>鏈潵鍚屾寮傛鏄敤鏉ヨ〃紺洪氳妯″紡鐨勶紝閫氫俊鐨勫悓姝ワ紝涓昏鏄寚瀹㈡埛绔湪鍙戦佽姹傚悗錛屽繀欏誨緱鍦ㄦ湇鍔$鏈夊洖搴斿悗鎵嶅彂閫佷笅涓涓姹傘傛墍浠ヨ繖涓椂鍊欑殑鎵鏈夎姹傚皢浼氬湪鏈嶅姟绔緱鍒板悓姝ャ傞氫俊鐨勫紓姝ワ紝鎸囧鎴風鍦ㄥ彂閫佽姹傚悗錛屼笉蹇呯瓑寰呮湇鍔$鐨勫洖搴斿氨鍙互鍙戦佷笅涓涓姹傦紝榪欐牱瀵逛簬鎵鏈夌殑璇鋒眰鍔ㄤ綔鏉ヨ灝嗕細鍦ㄦ湇鍔$寰楀埌寮傛錛岃繖鏉¤姹傜殑閾捐礬灝辮薄鏄竴涓姹傞槦鍒楋紝鎵鏈夌殑鍔ㄤ綔鍦ㄨ繖閲屼笉浼氬緱鍒板悓姝ョ殑銆備絾鏄釜浜烘劅瑙夛紝鍦ㄨ鍒皊ocket鐨勫悓姝ュ紓姝ユ椂鍊欙紝鍚屾璺熼樆濉炴蹇靛樊涓嶅錛岄兘鏄湁浜嗙粨鏋滄墠榪斿洖錛屽紓姝ュ垯鏄憡璇夌郴緇熸垜瑕乺ecv鏁版嵁錛岀劧鍚庨┈涓婅繑鍥烇紝絳夊緟鏁版嵁鏉ヤ簡鍚庯紝緋葷粺璺熺▼搴忚鏁版嵁鍒頒簡錛岀劧鍚庣▼搴忓啀recv鏁版嵁銆傚紩鐢ㄥ湪緗戜笂鐪嬪埌鐨勬瘮杈冨ソ鐨勬弿榪?#8220;闃誨 block 鏄寚錛屼綘鎷ㄩ氭煇浜虹殑鐢佃瘽錛屼絾鏄浜轟笉鍦紝浜庢槸浣犳嬁鐫鐢佃瘽絳変粬鍥炴潵錛屽叾闂翠笉鑳藉啀鐢ㄧ數璇濄傚悓姝ュぇ姒傚拰闃誨宸笉澶氥傞潪闃誨 nonblock 鏄寚錛屼綘鎷ㄩ氭煇浜虹殑鐢佃瘽錛屼絾鏄浜轟笉鍦紝浜庢槸浣犳寕鏂數璇濓紝寰呬細鍎垮啀鎵撱傝嚦浜庡埌鏃跺欎粬鍥炴潵娌℃湁錛屽彧鏈夋墦浜嗙數璇濇墠鐭ラ亾銆傚嵆鎵璋撶殑“杞 / poll”銆傚紓姝ユ槸鎸囷紝浣犳嫧閫氭煇浜虹殑鐢佃瘽錛屼絾鏄浜轟笉鍦紝浜庢槸浣犲彨鎺ョ數璇濈殑浜哄憡璇夐偅浜?leave a message)錛屽洖鏉ュ悗緇欎綘鎵撶數璇濓紙call back錛夈?#8221;
鏄劇劧錛屽紓姝ヨ楂樻晥涓浜涖傚湪Winsock涓疄鐜板紓姝ョ殑鏂規硶鏈夊緢澶氾紝Winsock宸ヤ綔妯″瀷鏈変笅闈㈠叚縐?br> 涓錛歴elect妯″瀷 浜岋細WSAAsyncSelect妯″瀷 涓夛細WSAEventSelect妯″瀷 鍥涳細Overlapped I/O 浜嬩歡閫氱煡妯″瀷 浜旓細Overlapped I/O 瀹屾垚渚嬬▼妯″瀷 鍏細IOCP妯″瀷 浠庝竴鍒板叚瓚婃潵瓚婇珮綰э紝瓚婃潵瓚婇珮鏁堬紝瀹炵幇瓚婃潵瓚婂鏉傘傛浘鍦ㄧ綉涓婄湅鍒頒竴浜涙瘮鍠葷敤鏉ュ緢濂界殑璇存槑榪欎簺妯″瀷錛屽湪榪欓噷寮曠敤涓涓嬨?/p>
鑰侀檲鏈変竴涓湪澶栧湴宸ヤ綔鐨勫コ鍎匡紝涓嶈兘緇忓父鍥炴潵錛岃侀檲鍜屽ス閫氳繃淇′歡鑱旂郴銆備粬浠殑淇′細琚偖閫掑憳鎶曢掑埌浠栦滑鐨勪俊綆遍噷銆?br>涓錛歴elect妯″瀷
鑰侀檲闈炲父鎯崇湅鍒板コ鍎跨殑淇°備互鑷充簬浠栨瘡闅?0鍒嗛挓灝變笅妤兼鏌ヤ俊綆憋紝鐪嬫槸鍚︽湁濂沖効鐨勪俊~~~~~ 鍦ㄨ繖縐嶆儏鍐典笅錛?#8220;涓嬫ゼ媯鏌ヤ俊綆?#8221;鐒跺悗鍥炲埌妤間笂鑰借浜嗚侀檲澶鐨勬椂闂達紝浠ヨ嚦浜庤侀檲鏃犳硶鍋氬叾浠栧伐浣溿?/p>
浜岋細WSAAsyncSelect妯″瀷
鍚庢潵錛岃侀檲浣跨敤浜嗗井杞叕鍙哥殑鏂板紡淇$銆傝繖縐嶄俊綆遍潪甯稿厛榪涳紝涓鏃︿俊綆遍噷鏈夋柊鐨勪俊浠訛紝鐩栬尐灝變細緇欒侀檲鎵撶數璇濓細鍠傦紝澶х埛錛屼綘鏈夋柊鐨勪俊浠朵簡錛佷粠姝わ紝鑰侀檲鍐嶄篃涓嶅繀棰戠箒涓婁笅妤兼鏌ヤ俊綆變簡錛岀墮涔熶笉鐤間簡錛屼綘鐬呭噯浜嗭紝钃濆ぉ......涓嶆槸錛屽井杞瘇~~~~~~~
涓夛細WSAEventSelect妯″瀷
鍚庢潵錛屽井杞殑淇$闈炲父鐣呴攢錛岃喘涔板井杞俊綆辯殑浜轟互鐧句竾璁℃暟......浠ヨ嚦浜庣洊鑼ㄦ瘡澶?4灝忔椂緇欏鎴鋒墦鐢佃瘽錛岀瘡寰楄叞閰歌儗鐥涳紝鍠濊殎鍔涚閮戒笉濂戒嬌~~~~~~ 寰蔣鏀硅繘浜嗕粬浠殑淇$錛氬湪瀹㈡埛鐨勫涓坊鍔犱竴涓檮鍔犺緗紝榪欎釜瑁呯疆浼氱洃瑙嗗鎴風殑淇$錛屾瘡褰撴柊鐨勪俊浠舵潵涓達紝姝よ緗細鍙戝嚭“鏂頒俊浠跺埌杈?#8221;澹幫紝鎻愰啋鑰侀檲鍘繪敹淇°傜洊鑼ㄧ粓浜庡彲浠ョ潯瑙変簡銆?/p>
鍥涳細Overlapped I/O 浜嬩歡閫氱煡妯″瀷
鍚庢潵錛屽井杞氳繃璋冩煡鍙戠幇錛岃侀檲涓嶅枩嬈笂涓嬫ゼ鏀跺彂淇′歡錛屽洜涓轟笂涓嬫ゼ鍏跺疄寰堟氮璐規椂闂淬備簬鏄井杞啀嬈℃敼榪涗粬浠殑淇$銆傛柊寮忕殑淇$閲囩敤浜嗘洿涓哄厛榪涚殑鎶鏈紝鍙鐢ㄦ埛鍛婅瘔寰蔣鑷繁鐨勫鍦ㄥ嚑妤煎嚑鍙鳳紝鏂板紡淇$浼氭妸淇′歡鐩存帴浼犻佸埌鐢ㄦ埛鐨勫涓紝鐒跺悗鍛婅瘔鐢ㄦ埛錛屼綘鐨勪俊浠跺凡緇忔斁鍒頒綘鐨勫涓簡錛佽侀檲寰堥珮鍏達紝鍥犱負浠栦笉蹇呭啀浜茶嚜鏀跺彂淇′歡浜嗭紒
浜旓細Overlapped I/O 瀹屾垚渚嬬▼妯″瀷
鑰侀檲鎺ユ敹鍒版柊鐨勪俊浠跺悗錛屼竴鑸殑紼嬪簭鏄細鎵撳紑淇″皝----鎺忓嚭淇$焊----闃呰淇′歡----鍥炲淇′歡......涓轟簡榪涗竴姝ュ噺杞葷敤鎴瘋礋鎷咃紝寰蔣鍙堝紑鍙戜簡涓縐嶆柊鐨勬妧鏈細鐢ㄦ埛鍙鍛婅瘔寰蔣瀵逛俊浠剁殑鎿嶄綔姝ラ錛屽井杞俊綆卞皢鎸夌収榪欎簺姝ラ鍘誨鐞嗕俊浠訛紝涓嶅啀闇瑕佺敤鎴蜂翰鑷媶淇?闃呰/鍥炲浜嗭紒鑰侀檲緇堜簬榪囦笂浜嗗皬璧勭敓媧伙紒
鍏細IOCP妯″瀷
寰蔣淇$浼間箮寰堝畬緹庯紝鑰侀檲涔熷緢婊℃剰銆備絾鏄湪涓浜涘ぇ鍏徃鎯呭喌鍗村畬鍏ㄤ笉鍚岋紒榪欎簺澶у叕鍙告湁鏁頒互涓囪鐨勪俊綆憋紝姣忕閽熼兘鏈夋暟浠ョ櫨璁$殑淇′歡闇瑕佸鐞嗭紝浠ヨ嚦浜庡井杞俊綆辯粡甯稿洜瓚呰礋鑽瘋繍杞屽穿婧冿紒闇瑕侀噸鏂板惎鍔紒寰蔣涓嶅緱涓嶄嬌鍑烘潃鎵嬮攺...... 寰蔣緇欐瘡涓ぇ鍏徃媧句簡涓鍚嶅悕鍙?#8220;Completion Port”鐨勮秴綰ф満鍣ㄤ漢錛岃榪欎釜鏈哄櫒浜哄幓澶勭悊閭d簺淇′歡錛?/p>
鍏跺疄錛屼笂闈㈡瘡縐嶆ā鍨嬮兘鏈変紭鐐癸紝瑕佹牴鎹▼搴忛渶姹傝岄傚綋閫夋嫨鍚堥傜殑妯″瀷錛屽墠闈笁縐嶆ā鍨嬫晥鐜囧凡緇忔瘮杈冮珮錛屽疄鐜拌搗鏉ラ毦閬撲笉澶э紝寰堝涓鑸殑緗戠粶紼嬪簭閮介噰鐢ㄥ墠涓夌妯″瀷錛屽彧鏈夊緗戠粶瑕佹眰鐗瑰埆楂樼殑涓浜涙湇鍔″櫒鎵嶄細鑰冭檻鐢ㄥ悗闈㈢殑閭d簺妯″瀷銆侻FC涓殑CAsyncSocket綾誨氨鏄敤鐨刉SAAsyncSelect妯″瀷錛岀數椹翠腑涔熸槸鐢ㄧ殑榪欑錛屼笉榪囧湪瀵繪壘瀵瑰簲socket鐨勬椂鍊欒繘琛屼簡浼樺寲錛屾煡鎵炬洿蹇紝鍦℅ridCast涓噰鐢ㄧ殑鏄疻SAEventSelect妯″瀷錛岀瓑寰呫?/p>
BTW錛氫笂闈㈡墍璇村潎鍦╓indows騫沖彴涓嬶紝鍙敤WinSock鎵嶆湁榪欎箞澶氭ā鍨嬶紝鍦╨inux涓嬶紝濂藉儚灝卞彧鏈夌涓縐峴elect妯″紡錛屾垜瀵筶inux涓嬬殑socket涓嶆槸寰堜簡瑙o紝搴旇涔熸湁寰堝鎻愰珮鏁堢巼鐨勫湴鏂廣?/p>
]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
亚洲国产导航 |
亚洲二区视频 |
久久成人综合视频 |
香蕉免费一区二区三区在线观看 |
国产精品视频久久一区 |
久久黄金** |
久久综合给合 |
一区二区高清在线 |
亚洲欧美视频 |
亚洲国产乱码最新视频 |
一本大道av伊人久久综合 |
国产欧美日韩精品a在线观看 |
久久激情五月婷婷 |
欧美国内亚洲 |
欧美怡红院视频 |
麻豆91精品91久久久的内涵 |
在线亚洲国产精品网站 |
亚洲综合色在线 |
亚洲精品国产品国语在线app |
夜夜嗨av一区二区三区网页 |
国产亚洲一级高清 |
亚洲欧洲美洲综合色网 |
国产有码在线一区二区视频 |
亚洲高清资源综合久久精品 |
国产精品嫩草久久久久 |
欧美激情视频免费观看 |
国产九九精品视频 |
91久久久一线二线三线品牌 |
国产视频精品免费播放 |
亚洲另类在线一区 |
欧美激情精品久久久久久大尺度 |
久久精品国产96久久久香蕉 |
一区二区三区四区五区精品视频 |
欧美一区二区三区视频在线 |
99re6这里只有精品 |
久久超碰97中文字幕 |
亚洲午夜免费视频 |
美日韩精品免费 |
久久久久欧美精品 |
欧美色区777第一页 |
欧美福利网址 |
尤物九九久久国产精品的分类 |
中文在线不卡 |
亚洲婷婷免费 |
欧美另类高清视频在线 |
亚洲第一天堂av |
国语自产精品视频在线看抢先版结局 |
99在线观看免费视频精品观看 |
亚洲福利免费 |
久久精品一区二区三区四区 |
欧美在线影院 |
国产欧美日韩综合一区在线播放 |
9l国产精品久久久久麻豆 |
亚洲激情校园春色 |
久久综合久色欧美综合狠狠 |
久久欧美中文字幕 |
国产在线精品二区 |
欧美一级视频一区二区 |
欧美中文字幕视频 |
国产人成一区二区三区影院 |
一区二区免费看 |
亚洲午夜91 |
国产精品色一区二区三区 |
夜夜嗨av一区二区三区网页 |
在线视频亚洲欧美 |
欧美性生交xxxxx久久久 |
99视频+国产日韩欧美 |
亚洲午夜免费福利视频 |
国产精品国产三级国产普通话99
|
亚洲欧美精品中文字幕在线 |
亚洲小说欧美另类社区 |
国产精品国产福利国产秒拍 |
亚洲少妇自拍 |
久久精品国产2020观看福利 |
国产主播精品在线 |
美女脱光内衣内裤视频久久网站 |
欧美激情影音先锋 |
一区二区三区四区在线 |
国产精品高清网站 |
亚洲尤物精选 |
美日韩精品视频 |
av72成人在线 |
国产精品一区二区三区四区五区 |
香蕉久久一区二区不卡无毒影院 |
久久野战av |
一本色道久久88精品综合 |
国产精品久久久久9999 |
久久久一区二区三区 |
亚洲欧洲精品成人久久奇米网 |
亚洲永久精品大片 |
激情综合色综合久久综合 |
欧美久久久久久久 |
欧美一级成年大片在线观看 |
欧美激情第五页 |
欧美伦理一区二区 |
美女网站在线免费欧美精品 |
亚洲精品一线二线三线无人区 |
欧美三日本三级少妇三2023
|
欧美大片在线观看一区二区 |
99在线观看免费视频精品观看 |
国产精品资源 |
欧美成人小视频 |
欧美一级久久久久久久大片 |
亚洲国产精品久久91精品 |
午夜国产精品影院在线观看 |
在线日韩中文字幕 |
国产精品久久一区二区三区 |
欧美成人激情视频免费观看 |
亚洲影院一区 |
亚洲精品在线观 |
美女黄色成人网 |
欧美在线观看一区 |
日韩亚洲视频 |
亚洲国语精品自产拍在线观看 |
国产精品一区在线观看 |
欧美日韩第一页 |
狂野欧美一区 |
久久黄色网页 |
亚洲欧美中文字幕 |
在线中文字幕日韩 |
亚洲黄网站黄 |
亚洲电影激情视频网站 |
久久久亚洲高清 |
性感少妇一区 |
午夜精品福利电影 |
亚洲尤物视频在线 |
一区二区av在线 |
日韩视频一区二区在线观看 |
亚洲国产精品传媒在线观看
|
欧美激情第9页 |
久热精品视频 |
麻豆国产va免费精品高清在线 |
欧美一区二区三区在线视频 |
亚洲亚洲精品三区日韩精品在线视频
|
韩国精品一区二区三区 |
国产精品久久国产三级国电话系列 |
欧美综合二区 |
欧美一区免费 |
久久久精彩视频 |
久久青草福利网站 |
另类专区欧美制服同性 |
美女国内精品自产拍在线播放 |
久久久噜噜噜久噜久久 |
久久免费观看视频 |
免费观看欧美在线视频的网站 |
你懂的网址国产 欧美 |
欧美大片国产精品 |
欧美日韩成人精品 |
欧美午夜视频 |
国产女主播一区 |
激情小说另类小说亚洲欧美
|
国产精品日产欧美久久久久 |
国产精品一二三视频 |
国产午夜精品福利 |
在线观看欧美日韩 |
99视频一区二区三区 |
亚洲综合电影 |
久久久www成人免费无遮挡大片 |
老司机精品视频网站 |
亚洲高清毛片 |
亚洲视频一区二区 |
欧美资源在线观看 |
欧美成人精品高清在线播放 |
欧美午夜无遮挡 |
韩日视频一区 |
一区二区三区蜜桃网 |
欧美中文在线字幕 |
亚洲成人在线视频播放 |
国产精品久久999 |
国产欧美一区二区三区沐欲 |
影音先锋一区 |
在线视频精品一 |
久久久国产精品一区 |
亚洲成色999久久网站 |
亚洲五月婷婷 |
噜噜噜躁狠狠躁狠狠精品视频 |
欧美精品日日鲁夜夜添 |
国产伦精品一区二区三区照片91 |
在线播放国产一区中文字幕剧情欧美
|
亚洲国产精品久久久久秋霞影院 |
欧美国产大片 |
亚洲天堂av在线免费观看 |
久久久欧美精品 |
国产精品国产馆在线真实露脸 |
亚洲高清毛片 |
欧美一级网站 |
亚洲精品女人 |
午夜日韩福利 |
欧美日本高清视频 |
亚洲电影自拍 |
久久精品道一区二区三区 |
亚洲精品网站在线播放gif |
久久国产手机看片 |
国产精品一区二区三区乱码
|
国内一区二区在线视频观看 |
av成人毛片 |
欧美激情第五页 |
久久精品国产精品亚洲精品 |
国产精品每日更新 |
中文一区在线 |