解决就给分!
顺便问下WSAGetLastError怎么查错误编号(10045)所对应的解释啊!
我在MSDN中查不到,菜的不好意思了!!

解决方案 »

  1.   

    WSAEOPNOTSUPP (10045)
    • Translation: Operation not supported.  
    • Description: The operation that was tried is not supported for the type of object that is referenced. This error typically occurs when a socket descriptor to a socket that cannot support this operation is trying to accept a connection on a datagram socket.  MS网站找的说明!
      

  2.   

    信息太少了.1. Overlapped的event是否create
    2. 是否提供有效的buffer (WSABUF 的指向buffer )
    如果以上的回答都是ok, 贴出代码
      

  3.   

    #define DATA_BUFSIZE 4096
    #include <WINSOCK2.H>
    #include <ostream.h>
    #pragma comment(lib,"ws2_32")
    void main(void)
    {
    DWORD recvbytes;
    DWORD flags;
    WSABUF databuf;
    char buffer[DATA_BUFSIZE];
    WSAEVENT eventarray[WSA_MAXIMUM_WAIT_EVENTS];
    WSAOVERLAPPED acceptoverlapped;
    SOCKET listensock,acceptsock;
    DWORD EventTotal=0;
    WSAData wsadata;
    SOCKADDR_IN SerAddr;
    WSAStartup(MAKEWORD(2,2),&wsadata); listensock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); SerAddr.sin_family = AF_INET;
    SerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    SerAddr.sin_port = htons(7780); bind(listensock,(SOCKADDR *)&SerAddr,sizeof(SerAddr));
    listen(listensock,5);
    acceptsock = accept(listensock,NULL,NULL);
    if (WSAGetLastError() == 0)
    {
    eventarray[EventTotal] = WSACreateEvent();
    ZeroMemory(&acceptoverlapped,sizeof(WSAOVERLAPPED));
    acceptoverlapped.hEvent = eventarray[EventTotal];
    databuf.len = DATA_BUFSIZE;
    databuf.buf = buffer;
    EventTotal++;
    int ii;
    ii = WSARecv(acceptsock,&databuf,1,&recvbytes,&flags,&acceptoverlapped,NULL);
    if ( ii == SOCKET_ERROR) 
    {
    ii = WSAGetLastError();
    if ( ii != WSA_IO_PENDING)
    {
    cout<<"WSARecv Error!"<<endl;
     closesocket(acceptsock);
     WSACloseEvent(eventarray[EventTotal]);
     return; }
    }
    } while (1)
    {
    DWORD dwIndex;
    DWORD BytesTransferred;
    DWORD Flags;
    dwIndex = WSAWaitForMultipleEvents(EventTotal,eventarray,FALSE,WSA_INFINITE,FALSE);
    WSAResetEvent(eventarray[dwIndex - WSA_WAIT_EVENT_0]); WSAGetOverlappedResult(acceptsock,&acceptoverlapped,&BytesTransferred, FALSE,&Flags);
    if (BytesTransferred == 0)
    {
    closesocket(acceptsock);
    WSACloseEvent(eventarray[dwIndex - WSA_WAIT_EVENT_0]);
    return;
    }
    }}
      

  4.   

    每次跟踪到WSARecv 下面的WSAGetLastError的返回值就发现返回10045错误
    郁闷啊
      

  5.   

    listensock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    -> listensock  = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 
          WSA_FLAG_OVERLAPPED);参数应该指定WSA_FLAG_OVERLAPPED 表示 为重叠
      

  6.   

    striking(硬撑者) 高手呀解决一下我的问题吧,谢谢
    http://community.csdn.net/Expert/topic/4663/4663080.xml?temp=.1440088
      

  7.   

    striking(硬撑者) 改了还是没用!
      

  8.   

    不晓得第一次accept是否就错了.
    1.
    WSAOVERLAPPED acceptoverlapped;->WSAOVERLAPPED acceptoverlapped[WSA_MAXIMUM_WAIT_EVENTS]; //每个client对应一个overlapp.
    ////////////////////////////////////////
    2.
    databuf.len = DATA_BUFSIZE;
    databuf.buf = buffer;buffer 道理同overlap.3.
    设flags=0;
    4. 最好将信息统一放在一个结构体内.如
    typedef struct _SOCKET_INFORMATION {
       CHAR Buffer[DATA_BUFSIZE];
       WSABUF DataBuf;
       SOCKET Socket;
       WSAOVERLAPPED Overlapped;
       DWORD BytesSEND;
       DWORD BytesRECV;
    } SOCKET_INFORMATION, * LPSOCKET_INFORMATION;
      

  9.   

    参数 WSA_FLAG_OVERLAPPED 不要再改回去!!
      

  10.   

    1.第一次accept的时候没错
    2.WSAOVERLAPPED acceptoverlapped[WSA_MAXIMUM_WAIT_EVENTS]; //每个client对应一个overlapp.  这个我知道。
    3.设flags=0?在哪里设?
    4.这个以后再考虑,先把这个问题搞定
      

  11.   

    既然第一次没有错, 那你知道怎么改了吗?你的程序只有一个 acceptoverlapped!!!
      

  12.   

    情况终于有了改观
    我设flag=0后,返回错误为10014了
    慢慢来,快了!!!