我在dotnet2003下写了如下代码,程序运行后提示accept error.程序也不阻塞,直接退出.
但是把ClientAddrLen = 0;赋初值的语句去掉accept语句返回正常,程序也处于阻塞状态,等待客户端连接.谁能给我解释一下这是为什么?代码如下:
// tcpserver.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA        wsaData;
    SOCKET         ListenSocket;
    SOCKET         ConnectSocket;
    SOCKADDR_IN    ServerAddr;
    SOCKADDR_IN    ClientAddr;
    int            ClientAddrLen;
    int            PortNo;
    int            Ret;    /* Init variable */
    memset(&wsaData,0x00,sizeof(wsaData));
    memset(&ListenSocket,0x00,sizeof(ListenSocket));
    memset(&ConnectSocket,0x00,sizeof(ConnectSocket));
    memset(&ServerAddr,0x00,sizeof(ServerAddr));
    memset(&ClientAddr,0x00,sizeof(ClientAddr));
    //ClientAddrLen = 0;
    PortNo        = 5150;
    Ret           = 0;    /* Init Winsock */
    if((Ret = WSAStartup(MAKEWORD(2,2),&wsaData)) != 0){
        printf("Winsock init error.\n");
        return(-1);
    }    /* Create listen socket */
    if((ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET){
        WSACleanup();
        printf("Socket create failed.\n");
        return(-1);
    }    /* Set SOCKADDR_IN structure */
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_port   = htons(PortNo);
    ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    if((Ret = bind(ListenSocket,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr))) == SOCKET_ERROR){
        closesocket(ListenSocket);
        WSACleanup();
        printf("bind error.\n");
        return(-1);
    }    /* Listen Port */
    if((Ret = listen(ListenSocket,1)) == SOCKET_ERROR){
        closesocket(ListenSocket);
        WSACleanup();
        printf("listen error.\n");
        return(-1);
    }    /* Create connection socket */
    if((ConnectSocket = accept(ListenSocket,(struct sockaddr *)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET){
        closesocket(ListenSocket);
        WSACleanup();
        printf("accept error.\n");
        return(-1);
    }
    printf("%d\n",ClientAddrLen);    /* Print client's IP */
    printf("You got a connection from %s\n.",inet_ntoa(ClientAddr.sin_addr));    /* send to the client welcome message */
    send(ConnectSocket,"Welcome to my server.\n",22,0);    closesocket(ConnectSocket);
    closesocket(ListenSocket);
    WSACleanup();    return 0;
}

解决方案 »

  1.   

    accept(ListenSocket,NULL,NULL);
    这样就可以咯  _-##
      

  2.   

    /* Create connection socket */
    ClientAddrLen=sizeof(ClientAddr); //*********大小都没求出来  还想调用正确啊
        if((ConnectSocket = accept(ListenSocket,(struct sockaddr *)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET){
            closesocket(ListenSocket);
            WSACleanup();
            printf("accept error.\n");
            return(-1);
        }
        printf("%d\n",ClientAddrLen);
      

  3.   

    ClientAddrLen是你要传递给accept的  不是用来接收结构大小的