下面的代码是一个TCP server端的代码一部分,采用Socket通讯,从msdn上 拷贝的.
if( listen( m_socket, 1 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");     SOCKET AcceptSocket;    printf( "Waiting for a client to connect...\n" );
    while (1) {
        AcceptSocket = SOCKET_ERROR;
        while ( AcceptSocket == SOCKET_ERROR ) {
            AcceptSocket = accept( m_socket, NULL, NULL );
        }
        printf( "Client Connected.\n");
        m_socket = AcceptSocket; 
        break;
    }
看到这里的时候我看不懂了,listen函数建立监听后,AcceptSocket = SOCKET_ERROR这句是什么意思? 让一个socket类型= SOCKET_ERROR是什么意思啊?? 这个SOCKET_ERROR又是什么呢? 它是什么情况下触发的呢??它应该是Socket 错误代码吧, 怎么会是一个socket 类型呢??而代码的意思似乎是说如果有客户端的connect,那么AcceptSocket == SOCKET_ERROR ,好象说只要有客户端connect,那么就会触发SOCKET_ERROR ,然后执行AcceptSocket = accept( m_socket, NULL, NULL )这句.?? 各位 这句代码到底怎么理解啊 ?? 谢谢指点啊!!

解决方案 »

  1.   

    AcceptSocket 是socket类型,用于accept
      

  2.   

    SOCKET_ERROR是listen( m_socket, 1 )的返回值,出错了就返回SOCKET_ERROR,
    if( listen( m_socket, 1 ) == SOCKET_ERROR )意识是如果监听失败,执行printf( "Error listening on socket.\n");
      

  3.   

    AcceptSocket是accept( m_socket, NULL, NULL )的返回值,
    据msdn上述:SOCKET accept (SOCKET s,struct sockaddr FAR* addr,  int FAR* addrlen            );
    所以accept返回SOCKET 类型;
    据msdn上述:
    If no error occurs, accept returns a value of type SOCKET that is a descriptor for the new socket. This returned value is a handle for the socket on which the actual connection will be made.Otherwise, a value of INVALID_SOCKET is returned, and a specific error code can be retrieved by calling
    如果accept没错误,则返回一个SOCKET,如果错误返回INVALID_SOCKET
    定义一个 SOCKET AcceptSocket;
     AcceptSocket = accept( m_socket, NULL, NULL )
    我想看他成功没比较一下if(AcceptSocket ==INVALID_SOCKET)
                          { AfxMessageBox("连接失败");
                           }
                         else
                             {AfxMessageBox("连接成功");
                                }
      

  4.   

    但是你说的 意思和while的 顺序不一样啊!你看这句的意思是如果先是AcceptSocket == SOCKET_ERROR这个条件满足后,才执行AcceptSocket =accept的返回socket值啊, while ( AcceptSocket == SOCKET_ERROR ) {
                AcceptSocket = accept( m_socket, NULL, NULL );
            }
    那么这个while执行的时候 AcceptSocket == SOCKET_ERROR 什么时候会满足呢??也就是说 这个SOCKET_ERROR  是 什么时候 从哪里 得来的啊?? 谢谢各位再指点指点!
      

  5.   

    while (1) {
            AcceptSocket = SOCKET_ERROR;
            while ( AcceptSocket == SOCKET_ERROR ) {
                AcceptSocket = accept( m_socket, NULL, NULL );
            }
    这个是不是这样理解啊?? 刚开始AcceptSocket = SOCKET_ERROR;所以
    while ( AcceptSocket == SOCKET_ERROR ) 这个相当于while(1), 所以执行AcceptSocket = accept( m_socket, NULL, NULL ); 这时如果没有 客户端connect 那么 AcceptSocket == SOCKET_ERROR  还是满足那么 继续循环,直到 有客户端连接,那么AcceptSocket返回了一个有效的socket后,while ( AcceptSocket == SOCKET_ERROR )的这个条件就不满足 所以 跳出整个while循环 继续执行 printf( "Client Connected.\n");这些下面的语句。如果是这样理那么我有一个问题就是说 accept的错误返回INVALID_SOCKET 和 SOCKET_ERROR  是一样的东西吗??也就是说如果 accept 错误那么 系统会 自动发送一个SOCKET_ERROR 而这个SOCKET_ERROR 就是INVALID_SOCKET ???
      

  6.   

    #define SOCKET_ERROR            (-1)
    SOCKET_ERROR实际上是个宏他被定义为 -1
    while ( AcceptSocket == SOCKET_ERROR ) 
    {
    AcceptSocket = accept( m_socket, NULL, NULL );
    }
    也就是如果AcceptSocket==-1的时候开始连接
      

  7.   

    #define INVALID_SOCKET  (SOCKET)(~0)
    你可以选定要看的如SOCKET_ERROR 然后点右建,按go to Definition 相看
    最好把全部的原代码贴出来!!!一段看不明白
      

  8.   

    while (1)                                    //死循环
    {     AcceptSocket = SOCKET_ERROR;     //AcceptSocket=-1
        while ( AcceptSocket == SOCKET_ERROR )           //AcceptSocket=-1
         
              {
                AcceptSocket = accept( m_socket, NULL, NULL );//连上返回连接的SOCKET,没连                          //上返回INVALID_SOCKET, AcceptSocket!=SOCKET_ERROR 了;退出while ( AcceptSocket)
              }
    printf( "Client Connected.\n");
    m_socket = AcceptSocket;
    break;
    }
      

  9.   

    你的 这个理解是否有点问题? 你看代码 如果说AcceptSocket = accept而accept返回INVALID_SOCKET, AcceptSocket!=SOCKET_ERROR 了;退出while ( AcceptSocket),那么为什么会执行printf( "Client Connected.\n")??? 所以 代码的意思应该是如果有客户端连上的话 退出 while ( AcceptSocket == SOCKET_ERROR )  然后printf( "Client Connected.\n"); 如果没有连上的话
    while ( AcceptSocket == SOCKET_ERROR )继续循环一直等到有连接才跳出这个 while!我代码明天贴给你, 现在 不在我这台机子上! 非常感谢你 bt66666666这么晚了 还热心的帮忙!
      

  10.   

    while ( AcceptSocket == SOCKET_ERROR ) //AcceptSocket=-1{
    AcceptSocket = accept( m_socket, NULL, NULL );//连上返回连接的SOCKET,没连 //上返回INVALID_SOCKET, AcceptSocket!=SOCKET_ERROR 了;退出while ( AcceptSocket)
    }
    完了,本来就应该继续执行下一条语句,下一条就是printf( "Client Connected.\n");
    完了在m_socket = AcceptSocket;在退出循环
      

  11.   

    printf( "Client Connected.\n");是说有如果有连上就输出Client connected ,而你的意思是说 不管连上没连上 会输出 这个 语句! 这个和我程序执行的 结果也不符合的! 我程序是 每次有udp端口 客户端连上, 才会输出Client connected ,不然 程序是不会输出这个的,一直在等待。 每连接一次 就输出一次Client connected 这个语句的!程序明天贴你看下!
      

  12.   

    bt66666666(), 这个是原代码 你执行下
    #include "stdafx.h"#include <stdio.h>
    #include "winsock2.h"
    int main(int argc, char* argv[])
    {
        // Initialize Winsock.
        WSADATA wsaData;
        int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
        if ( iResult != NO_ERROR )
            printf("Error at WSAStartup()\n");    // Create a socket.
        SOCKET m_socket;
        m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );    if ( m_socket == INVALID_SOCKET ) {
            printf( "Error at socket(): %ld\n", WSAGetLastError() );
            WSACleanup();
            return 0;
        }
        // Bind the socket.
        sockaddr_in service;    service.sin_family = AF_INET;
        service.sin_addr.s_addr = inet_addr( "10.167.11.89" );
        service.sin_port = htons( 6002 );    if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
            printf( "bind() failed.\n" );
            closesocket(m_socket);
            return 0;
        }
        
        // Listen on the socket.
        if ( listen( m_socket, 1 ) == SOCKET_ERROR )
            printf( "Error listening on socket.\n");    // Accept connections.
        SOCKET AcceptSocket;    printf( "Waiting for a client to connect...\n" );
        while (1) {
            AcceptSocket = SOCKET_ERROR;
            while ( AcceptSocket == SOCKET_ERROR ) {
                AcceptSocket = accept( m_socket, NULL, NULL );
            }
            printf( "Client Connected.\n");
            m_socket = AcceptSocket; 
           // break;
        }
        
        // Send and receive data.
        int bytesSent;
        int bytesRecv = SOCKET_ERROR;
        char sendbuf[32] = "Server: Sending Data.";
        char recvbuf[32] = "";
        
        bytesRecv = recv( m_socket, recvbuf, 32, 0 );
        printf( "Bytes Recv: %ld\n", bytesRecv );
        
        bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
        printf( "Bytes Sent: %ld\n", bytesSent );    return NULL; //return 0;
    }
      

  13.   

    这个代码在 while(1)这里是永远循环的! 当第一次有client 连接上时 AcceptSocket 就被赋值一个连接过来的connected client 这时,while ( AcceptSocket == SOCKET_ERROR )条件不满足,执行 printf( "Client Connected.\n");m_socket = AcceptSocket; 程序继续执行,AcceptSocket = SOCKET_ERROR; while ( AcceptSocket == SOCKET_ERROR )这个满足执行,这时由于第一次连接后 m_socket = AcceptSocket; 所以这时 accept( m_socket, NULL, NULL ); 应该返回一个INVALID_SOCKET, 并且把这个值赋给AcceptSocket; 但是我用单步调试的时候发现  while ( AcceptSocket == SOCKET_ERROR ) {
                AcceptSocket = accept( m_socket, NULL, NULL );
            } 这个循环体会一直循环, 进入死循环. 也就是说accept 的返回值INVALID_SOCKET永远=SOCKET_ERROR 使得循环体一直循环下去. 但是我去看了下 头文件,发现
    #define INVALID_SOCKET  (SOCKET)(~0)
    #define SOCKET_ERROR (-1)  ,从个宏定义看,如果accept返回INVALID_SOCKET 应该不等于SOCKET_ERROR (-1) 才对啊?? 为什么 程序是一直循环的呢???
      

  14.   

    while (1) {
    AcceptSocket = SOCKET_ERROR;
    while ( AcceptSocket == SOCKET_ERROR ) {
    AcceptSocket = accept( m_socket, NULL, NULL );
    }
    printf( "Client Connected.\n");
    m_socket = AcceptSocket;
    // break;//这是个死循环啊,循环退不出!!!
    }
      

  15.   

    我把它去掉就正常了发10个字节收到10 个把break 前的//去掉了!!
    #include <stdio.h>
    #include "winsock2.h"
    int main(int argc, char* argv[])
    {
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
    printf("Error at WSAStartup()\n");// Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );if ( m_socket == INVALID_SOCKET ) {
    printf( "Error at socket(): %ld\n", WSAGetLastError() );
    WSACleanup();
    return 0;
    }
    // Bind the socket.
    sockaddr_in service;service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr( "202.114.61.73" );
    service.sin_port = htons(6002);if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
    printf( "bind() failed.\n" );
    closesocket(m_socket);
    return 0;
    }// Listen on the socket.
    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
    printf( "Error listening on socket.\n");// Accept connections.
    SOCKET AcceptSocket;printf( "Waiting for a client to connect...\n" );
    while (1) 
    {
          AcceptSocket = SOCKET_ERROR;
           while ( AcceptSocket == SOCKET_ERROR ) 
       {
             AcceptSocket = accept( m_socket, NULL, NULL );
       }
        printf( "Client Connected.\n");
        m_socket = AcceptSocket;
     break;
    }// Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Server: Sending Data.";
    char recvbuf[32] = "";bytesRecv = recv( m_socket, recvbuf, 32, 0 );
    printf( "Bytes Recv: %ld\n", bytesRecv );bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );return NULL;//return 0;
    }
      

  16.   

    #include <windows.h>
    #include <stdio.h>
    #include <winsock.h>int main()
    {
     WORD wVersionRequested;
     WSADATA wsaData; 
    wVersionRequested = MAKEWORD( 2, 2 );
     
     WSAStartup( wVersionRequested, &wsaData ); 
    if ( LOBYTE( wsaData.wVersion ) != 2 ||
            HIBYTE( wsaData.wVersion ) != 2 ) {    WSACleanup( );
         
    }
       SOCKET socketclient=socket(AF_INET,SOCK_STREAM,0);
        SOCKADDR_IN addr;
    addr.sin_addr.S_un.S_addr=inet_addr("202.114.61.73");
    addr.sin_family=AF_INET;
    addr.sin_port=htons(6002);
    connect(socketclient,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    char buf[100];

    char bufsend[100]="SB我晓得了";
    send(socketclient,bufsend,strlen(bufsend),0);
        recv(socketclient,buf,100,0);
        printf("%s",buf);
    }
      

  17.   

    谢谢你,准备结贴了! 不过我想问下 socket的 select你用过哇?? 我好象看的不是很明白, 能告诉我你的msn吗?? 想请教下你!