本帖最后由 VisualEleven 于 2010-11-16 11:49:50 编辑

解决方案 »

  1.   

    if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))
    //这样调用就会出错
    if(( pthis->m_aSocket= accept(pthis->m_sSocket, NULL, NULL)) == INVALID_SOCKET)
    //这样调用就没有问题,我很是郁闷,似乎成与不成之间就是在参数上面
    但是我后来作为补救调用:
    getpeername却没问题
      

  2.   

    你应该用WSAGetLastError来查看下错误返回值是多少
      

  3.   

    当然是参数问题,自己不会看MSDN,人家说的很清楚
    accept的pthis->m_clientAddrLen这个参数的值要传递进去的
    是[in,out]的就是传进传出的参数
    要不你就干脆弄成NULL
    否则参数必须传递进去
    也就是先pthis->m_clientAddrLen = sizeof(SOCKADDR _IN);
    再:
    if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))
      

  4.   

    本帖最后由 VisualEleven 于 2010-11-10 11:05:46 编辑
      

  5.   

    自己看WSAGetLastError函数的返回值
      

  6.   

    WSAGetLastError第一次为0但是已经出错,无法绑定IO端口
    第二次10038,因该是第一次出错导致sock被关闭了
      

  7.   

    10038: An operation was attempted on something that is not a socket. 
      

  8.   

    问题在于if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))
             {
             AfxMessageBox("获取远程连接出错,正在重新开始服务`````");
             }
    int i=WSAGetLastError();
    AfxMessageBox("error");         pthis->OnAccept(pthis->m_aSocket);    //   调用 OnAccept()通知应用程序有新客户端连接
     if(pthis->m_aSocket==0)
     { i=WSAGetLastError();
     AfxMessageBox("error");
     }
    第一次返回0的时候已经出错 了~
      

  9.   

    额不大喜欢看网上贴的代码,太麻烦。
    pthis->m_aSocket  = accept(
    pthis->m_sSocket,
    (SOCKADDR *)&pthis->m_clientAddr,
    &(pthis->m_clientAddrLen)) 
    == INVALID_SOCKET)
    你敢不敢不用pthis->m_aSocket这个句柄去接收新连接的句柄
    你这个pthis->m_aSocket句柄已经在 accept()第一个参数里出现过了我没猜错pthis->m_aSocket应该是有值的。。你然后accept之后,把这个值改变了咱这样行不
    SOCKET LSocket;
    LSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen))
    if (( LSocket == INVALID_SOCKET))
    {
       AfxMessageBox("获取远程连接出错,正在重新开始服务`````");
     }
      

  10.   

    Sorry看错了。你的两个socket不同的。
    你的socket绑定失败?
      

  11.   

    根据网上的说法,貌似IOCP模型下accept不能使用···我砍好像没有用的
    accept的时候可以成功获得客户端的IP 地址,但是accept返回的是0·····第一次,第二次都是返回0
      

  12.   

    下面这行的第一个参数错了,应该是accept(pthis->m_ListenSocket, ...........
    if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))
      

  13.   

    如果没有pthis->m_ListenSocket,就添加这个成员,并在上面bind,listen
      

  14.   

    根本不是的··
    if(( pthis->m_aSocket= accept(pthis->m_sSocket, NULL, NULL)) == INVALID_SOCKET)
    一点问题都没有~~~~~
      

  15.   

    第一个是
    if ((pthis->m_aSocket=(...)== INVALID_SOCKET))
    //意思是m_aSocket赋值为后面判断式的值?
    if(( pthis->m_aSocket=(...))== INVALID_SOCKET)
    //意思是m_aSocket赋值后的布尔值来判断等于INVALID_SOCKET不?
    但愿没看错~意思有点费解哦
      

  16.   

    以前编程accept都在主线程里,有连接就开启新线程。但这不是主要原因。
      

  17.   

    已经自己解决了,是因为if语句使用不当
    if ((pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen)) == INVALID_SOCKET))
    改为
    pthis->m_aSocket= accept(pthis->m_sSocket,(SOCKADDR *)&pthis->m_clientAddr,&(pthis->m_clientAddrLen);
    就ok了~~~~~结贴