服务器端: WORD wVersionRequested;
WSADATA wsaData;
int err;
char buffer[256];
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return ;
} SOCKET Sockets[WSA_MAX_WAIT_EVENT];
WSAEVENT Event[WSA_MAX_WAIT_EVENT];
SOCKET Accept, Listen;
DWORD EventTotal = 0;
DWORD Index; Listen = socket(AF_INET, SOCK_STREAM, 0);
WSAEVENT NewEvent;
NewEvent = WSACreateEvent();
WSAEventSelect(Listen, NewEvent, FD_ACCEPT|FD_CLOSE); char hostname[256];
gethostname(hostname,sizeof(hostname)); //这一代码是为
HOSTENT*hos=gethostbyname(hostname); //了实现自动获取安
CString CS=inet_ntoa(*(struct in_addr*)hos->h_addr_list[0]);// 装程序的主机代码
SOCKET socksrv = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in saServer;
//saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//宏INADDR_ANY定义的是0
saServer.sin_addr.S_un.S_addr = inet_addr(CS);//宏INADDR_ANY定义的是0
saServer.sin_family = AF_INET;
saServer.sin_port = htons(6000);
bind(socksrv, (SOCKADDR*)&saServer, sizeof(SOCKADDR)); listen(Listen, 5); for(int i=0; i<WSA_MAX_WAIT_EVENT; i++)
{
Sockets[i] = INVALID_SOCKET;
Event[i] = WSA_INVALID_EVENT; } Sockets[EventTotal] = Listen;
Event[EventTotal] = NewEvent;
EventTotal++; WSANETWORKEVENTS NetworkEvent; // flag1 = 1;
while(1)
{
Index = WSAWaitForMultipleEvents(EventTotal, Event, FALSE, WSA_INFINITE, FALSE);
WSAEnumNetworkEvents(Sockets[Index - WSA_WAIT_EVENT_0], Event[Index - WSA_WAIT_EVENT_0],
&NetworkEvent);
if(NetworkEvent.lNetworkEvents & FD_ACCEPT)
{
Accept = accept(Sockets[Index - WSA_WAIT_EVENT_0], NULL, NULL);
if(EventTotal > WSA_MAX_WAIT_EVENT)
{
closesocket(Accept);
break;
}
NewEvent = WSACreateEvent();
WSAEventSelect(Accept, NewEvent, FD_WRITE|FD_READ|FD_CLOSE);
Sockets[EventTotal] = Accept;
Event[EventTotal] = NewEvent;
EventTotal++;
}
if(NetworkEvent.lNetworkEvents & FD_READ)
{
recv(Sockets[Index - WSA_WAIT_EVENT_0], buffer, sizeof(buffer), 0);
}
if(NetworkEvent.lNetworkEvents & FD_WRITE)
{
send(Sockets[Index - WSA_WAIT_EVENT_0], "this is a text", sizeof("this is a text"), 0); }
if(NetworkEvent.lNetworkEvents & FD_CLOSE)
{
closesocket(Sockets[Index - WSA_WAIT_EVENT_0]);
for(int j=Index - WSA_WAIT_EVENT_0; j<WSA_MAX_WAIT_EVENT-1; j++)
{
Sockets[j] = Sockets[j+1];
Event[j] = Event[j+1];
}
Sockets[WSA_MAX_WAIT_EVENT-1] = INVALID_SOCKET;
Event[WSA_MAX_WAIT_EVENT-1] = WSA_INVALID_EVENT;
} }
WSACleanup();
return ;
客户端在同一台机器上:
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{ WSACleanup( );
return;
} char hostname[256];
gethostname(hostname,sizeof(hostname)); //这一代码是为
HOSTENT*hos=gethostbyname(hostname); //了实现自动获取安
CString CS=inet_ntoa(*(struct in_addr*)hos->h_addr_list[0]);// 装程序的主机代码
sockclt = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in saClient;
//saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//宏INADDR_ANY定义的是0
saClient.sin_addr.S_un.S_addr = inet_addr(CS);//宏INADDR_ANY定义的是0
saClient.sin_family = AF_INET;
saClient.sin_port = htons(6000);
connect(sockclt, (SOCKADDR*)&saClient, sizeof(SOCKADDR));
send(sockclt, "this is cao", strlen("this is cao")+1, 0);
closesocket(sockclt);
WSACleanup();为什么服务器端停在了Index = WSAWaitForMultipleEvents(EventTotal, Event, FALSE, WSA_INFINITE, FALSE);
相当于没有事件传信,请问这段程序有问题么,这是我按照书上试着写的,能给指出是什么问题么?
谢谢!!!
WSADATA wsaData;
int err;
char buffer[256];
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return ;
} SOCKET Sockets[WSA_MAX_WAIT_EVENT];
WSAEVENT Event[WSA_MAX_WAIT_EVENT];
SOCKET Accept, Listen;
DWORD EventTotal = 0;
DWORD Index; Listen = socket(AF_INET, SOCK_STREAM, 0);
WSAEVENT NewEvent;
NewEvent = WSACreateEvent();
WSAEventSelect(Listen, NewEvent, FD_ACCEPT|FD_CLOSE); char hostname[256];
gethostname(hostname,sizeof(hostname)); //这一代码是为
HOSTENT*hos=gethostbyname(hostname); //了实现自动获取安
CString CS=inet_ntoa(*(struct in_addr*)hos->h_addr_list[0]);// 装程序的主机代码
SOCKET socksrv = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in saServer;
//saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//宏INADDR_ANY定义的是0
saServer.sin_addr.S_un.S_addr = inet_addr(CS);//宏INADDR_ANY定义的是0
saServer.sin_family = AF_INET;
saServer.sin_port = htons(6000);
bind(socksrv, (SOCKADDR*)&saServer, sizeof(SOCKADDR)); listen(Listen, 5); for(int i=0; i<WSA_MAX_WAIT_EVENT; i++)
{
Sockets[i] = INVALID_SOCKET;
Event[i] = WSA_INVALID_EVENT; } Sockets[EventTotal] = Listen;
Event[EventTotal] = NewEvent;
EventTotal++; WSANETWORKEVENTS NetworkEvent; // flag1 = 1;
while(1)
{
Index = WSAWaitForMultipleEvents(EventTotal, Event, FALSE, WSA_INFINITE, FALSE);
WSAEnumNetworkEvents(Sockets[Index - WSA_WAIT_EVENT_0], Event[Index - WSA_WAIT_EVENT_0],
&NetworkEvent);
if(NetworkEvent.lNetworkEvents & FD_ACCEPT)
{
Accept = accept(Sockets[Index - WSA_WAIT_EVENT_0], NULL, NULL);
if(EventTotal > WSA_MAX_WAIT_EVENT)
{
closesocket(Accept);
break;
}
NewEvent = WSACreateEvent();
WSAEventSelect(Accept, NewEvent, FD_WRITE|FD_READ|FD_CLOSE);
Sockets[EventTotal] = Accept;
Event[EventTotal] = NewEvent;
EventTotal++;
}
if(NetworkEvent.lNetworkEvents & FD_READ)
{
recv(Sockets[Index - WSA_WAIT_EVENT_0], buffer, sizeof(buffer), 0);
}
if(NetworkEvent.lNetworkEvents & FD_WRITE)
{
send(Sockets[Index - WSA_WAIT_EVENT_0], "this is a text", sizeof("this is a text"), 0); }
if(NetworkEvent.lNetworkEvents & FD_CLOSE)
{
closesocket(Sockets[Index - WSA_WAIT_EVENT_0]);
for(int j=Index - WSA_WAIT_EVENT_0; j<WSA_MAX_WAIT_EVENT-1; j++)
{
Sockets[j] = Sockets[j+1];
Event[j] = Event[j+1];
}
Sockets[WSA_MAX_WAIT_EVENT-1] = INVALID_SOCKET;
Event[WSA_MAX_WAIT_EVENT-1] = WSA_INVALID_EVENT;
} }
WSACleanup();
return ;
客户端在同一台机器上:
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{ WSACleanup( );
return;
} char hostname[256];
gethostname(hostname,sizeof(hostname)); //这一代码是为
HOSTENT*hos=gethostbyname(hostname); //了实现自动获取安
CString CS=inet_ntoa(*(struct in_addr*)hos->h_addr_list[0]);// 装程序的主机代码
sockclt = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in saClient;
//saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//宏INADDR_ANY定义的是0
saClient.sin_addr.S_un.S_addr = inet_addr(CS);//宏INADDR_ANY定义的是0
saClient.sin_family = AF_INET;
saClient.sin_port = htons(6000);
connect(sockclt, (SOCKADDR*)&saClient, sizeof(SOCKADDR));
send(sockclt, "this is cao", strlen("this is cao")+1, 0);
closesocket(sockclt);
WSACleanup();为什么服务器端停在了Index = WSAWaitForMultipleEvents(EventTotal, Event, FALSE, WSA_INFINITE, FALSE);
相当于没有事件传信,请问这段程序有问题么,这是我按照书上试着写的,能给指出是什么问题么?
谢谢!!!
解决方案 »
- VS2010 _MFC程序_内存泄露问题
- 一个对话框工程,如何在程序运行后,只显示上本部分
- BSTR 和VARIANT 内存泄露问题
- 怎么在TreeCtrl中插入指定位置的新节点?
- 错误提示error C2664: 'strcmp' : cannot convert parameter 1 from 'wchar_t *' to 'const char *'
- 切分窗口时出现如下错误,怎么回事?
- 这个简单的宏定义中有什么问题?
- CTime与long之间的转换
- MSDN是不是有中文版了??
- 函数返回CString的问题
- 快到过年了,不知道还有没有高手愿意移动了?
- 问一下这里的函数申明老是报错,是怎么回事啊?
改为Listen = socket(PF_INET, SOCK_STREAM, 0);
///////////////////////////////
listen(socksrv , 5);