最简单的一个程序,接受客户端连接之后,向客户端发送字符串,代码贴出来:
#include <Winsock2.h>
#include <iostream>
#pragma comment (lib,"Ws2_32.lib")
using namespace std;
int main()
{
int ret = 0;
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 1;
} if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 1; 
} SOCKET sock, sockarray[5];
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP ); sockaddr_in sockinfo;
sockinfo.sin_family = AF_INET;
sockinfo.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
sockinfo.sin_port = htons(5000); bind(sock,reinterpret_cast<sockaddr *>(&sockinfo),sizeof(sockaddr));
/////////////////////////////////////////////////////// WSAEVENT evnt = WSACreateEvent();
WSAEVENT evntarray[5];
int count = 0;
WSAEventSelect(sock,evnt,FD_ACCEPT | FD_CLOSE);
listen(sock,5); sockarray[count] = sock;
evntarray[count] = evnt;
count++;
while(true)
{
SOCKET s;
int len = sizeof(sockaddr);
int Index = 0;
Index = WSAWaitForMultipleEvents(count,evntarray,FALSE,WSA_INFINITE,FALSE);
if(Index == WSA_WAIT_FAILED)
{
cout<<"failed"<<endl;
}
Index -= WSA_WAIT_EVENT_0; WSANETWORKEVENTS netevent;
ret = WSAEnumNetworkEvents(sockarray[Index],evntarray[Index],&netevent);
if(netevent.lNetworkEvents & FD_ACCEPT)
{
cout<<" FD_ACCEPT"<<endl;
s = accept(sockarray[Index],reinterpret_cast<sockaddr *>(&sockinfo),&len);
if(sockarray[Index] != INVALID_SOCKET )
{
WSAEVENT newevnt = WSACreateEvent();
WSAEventSelect(sockarray[Index],newevnt,FD_WRITE); sockarray[count] = s;
evntarray[count] = newevnt;
count++;
}
}
else if(netevent.lNetworkEvents & FD_WRITE )
{
cout<<" FD_WRITE"<<endl;
send(sockarray[Index],"WSAEventSelect",sizeof("WSAEventSelect")+1,0);
}
}
return 0;
}简单到FD_CLOSE Event 也没处理,这里没关系,我只是要能发送就行。客户端就是接收一条字符串

解决方案 »

  1.   

    如果帮我调试的话,我把客户端代码也贴出来,反正是最基本的那种,这个没问题#include <winsock.h>
    #include <iostream>
    using namespace std;#pragma comment (lib,"Ws2_32.lib" )
    int main()
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
    return 1;
    } if ( LOBYTE( wsaData.wVersion ) != 2 ||
    HIBYTE( wsaData.wVersion ) != 2 ) {
    WSACleanup( );
    return 1; 
    } //////
    SOCKET ConnectSock ;
    ConnectSock = socket(AF_INET ,SOCK_STREAM,IPPROTO_TCP);
    if(ConnectSock == SOCKET_ERROR)
    {
    printf("Error at socket(): %ld\n", WSAGetLastError());
    WSACleanup();
    return 1;
    } sockaddr_in SockAddr_info;
    SockAddr_info.sin_family = AF_INET;
    SockAddr_info.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    SockAddr_info.sin_port = htons(5000); int ret = connect(ConnectSock,reinterpret_cast <const sockaddr*>(&SockAddr_info),sizeof(sockaddr_in)) ;
    if( ret==SOCKET_ERROR)
    {
    printf( "Failed to connect.\n" );
    WSACleanup();
    return 1;
    }
    printf("Connected to server.\n");
    char rcv[30];
    ret = recv(ConnectSock,rcv,30,0 );
    cout<<ret<<'\n'<<rcv<<endl;
    closesocket(ConnectSock);
    WSACleanup(); system("pause");
    return 0;
    }
      

  2.   


    if(netevent.lNetworkEvents & FD_READ)
    {
    if(netevent.iErrorCode[FD_READ_BIT] == 0)
    {
    // 接收到数据,并发送数据
    }
    }
      

  3.   

    我的想法是:
    第一遍while接受请求,然后在第二遍while里,再WSAWaitForMultipleEvents。收到一个FD_WRITE 再send回去
    。接受请求后立即send的话,这时候还没收到FD_WRITE呢