重叠模式IO的SOCKET 已经实现一server对一client的了 怎么实现一server对应多client的呢
是要用多个WSAOVERLAPPED吗?
是要用多个WSAOVERLAPPED吗?
解决方案 »
- 装了多遍VS2005,除了对话框控件,VC下的好多控件还是灰色的,不能用,救命呀
- 为什么mfc的CAsyncSocket客户端收不到数据?
- 如何编译驱动程序?
- 关于对话框中的 编辑框 在编辑框中怎么把按“回车”自动变成按“Tab”
- 请问最新的MSDN是不是完全中文版?
- 怎样用VBA得到Powerpoint内容的框架结构??谢谢
- 请解释一下什么是“DEBUG版”,什么是“RELAESE版”。
- 怎样开发自己的游戏3D引擎?
- [Help]钩子函数钩不到shutdown, logoff, restart事件
- 请问哪里能找到RTF(超文本)文件格式的中文资料?谢谢!
- 套接字怎么老错误呢? 谁帮忙看看 谢了
- 请教一个问题关于socket
任何一种模型都可以实现1server对多client的
如果你已经知道了一个server对应一个client的实现方法的话.那么对应多个client的话,我想可以另外开一个线程来负责accept().
#include <winsock2.h>
using namespace std;#define WSA_MAX_WAIT_EVENTS 100
DWORD WINAPI Client(LPVOID);
int main()
{
WORD wsaVersionRequested;
WSADATA wsaData;
int err;
int Index;
int EventTotal=0;
char recvbuff[1024];
DWORD Flags,RecvBytes,ByteTransferred;
WSABUF DataBuf;
WSAEVENT EventArray[WSA_MAX_WAIT_EVENTS];
WSAOVERLAPPED AcceptOverlapped; wsaVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wsaVersionRequested,&wsaData);
CreateThread(NULL,0,Client,NULL,0,NULL);
if(err<0)
return 0;
SOCKET server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); bind(server,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(server,5);
SOCKADDR_IN addrClt;
int len=sizeof(SOCKADDR);
SOCKET AcceptSocket=accept(server,(SOCKADDR*)&addrClt,&len);
cout << inet_ntoa(addrClt.sin_addr) << endl;
EventArray[EventTotal]=WSACreateEvent();
ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
AcceptOverlapped.hEvent=EventArray[EventTotal];
DataBuf.len=1024;
DataBuf.buf=recvbuff;
EventTotal++;
int byteRecv=SOCKET_ERROR; WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL); cout << DataBuf.buf << endl;
while(1)
{
Index=WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
WSAResetEvent(EventArray[Index-WSA_WAIT_EVENT_0]); WSAGetOverlappedResult(AcceptSocket,&AcceptOverlapped,&ByteTransferred,FALSE,&Flags); if(ByteTransferred==0)
{
closesocket(AcceptSocket);
WSACloseEvent(EventArray[Index-WSA_WAIT_EVENT_0]);
return 0;
}
cout << DataBuf.buf << endl;
Flags=0;
ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
AcceptOverlapped.hEvent=EventArray[Index-WSA_WAIT_EVENT_0];
WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL);
}
}DWORD WINAPI Client(LPVOID lpParam)
{
WORD wsaVersionRequested;
WSADATA wsaData;
int err;
wsaVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wsaVersionRequested,&wsaData);
if(err<0)
return 0;
SOCKET client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
addrSrv.sin_addr.S_un.S_addr=inet_addr("10.200.121.33");
while(connect(client,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)));
cout << "Connected.\n";
char sendbuff[1024];
int byteSend=SOCKET_ERROR;
memset(sendbuff,0x00,1024);
memcpy(sendbuff,"Hello",sizeof("Hello"));
cout << sendbuff << endl;
while(byteSend==SOCKET_ERROR)
byteSend=send(client,sendbuff,strlen(sendbuff),0);
cout << WSAGetLastError();
while(1)
{
memset(sendbuff,0x00,1024);
cin >> sendbuff;
send(client,sendbuff,strlen(sendbuff),0);
}
return 0;
}
为什么DataBuf没有改变?