昨天使用一个WINSOCK做的聊天应用实例,服务器端在实现监听时出现无法绑定地址的问题。
对于这里的地址绑定实现,是通过对话框输入本机IP以及端口,利用bind()进行绑定,但总是提示绑定地址错误
这是一本书中的一个实例,代码认为没有问题,
我的问题是:这里绑定地址对于本机的网络有要求么?比如本机没有连接网络可以绑定成功么?不行的话为什么?
如果可以绑定,在对本机的IP进行设置时如何设置?

解决方案 »

  1.   

    你是不是把书上的IP输入了?用INADDR_ANY让系统自动分配。端口应该在1024~5000之间
      

  2.   

    本地网络不连接没问题
    不过得安装了TCP/IP协议,没有协议是不行的...
      

  3.   

    //服务器端地址
    sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; m_IP.GetWindowText(m_serverIP); //设置本机地址
    serveraddr.sin_addr.S_un.S_addr  = inet_addr(m_serverIP); UpdateData(TRUE);
    //设置端口号
    serveraddr.sin_port = htons(m_port); //绑定地址
    if (bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr)))
    {
    MessageBox("绑定失败");
    return;
    }
    //开始监听
    listen(m_server,50);这个是服务器端的绑定监听代码  
    不知道为什么绑定总是提示绑定失败--我输入的是本机设置的IP如果把绑定地址那段代码去掉 这个程序能正常运行,通过局域网也能实现所需的功能
      

  4.   

    m_port是从对话框取出的吧,应该是个字符串类型,转成USHORT类型了吗?
      

  5.   

    m_port是端口号,本身为UNIT类型  
    需要改么?
    不该是这里问题 ,就是本机IP绑定问题吧~
    我把
    //绑定地址 
    if (bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr))) 

    MessageBox("绑定失败"); 
    return; 

    这段给屏蔽了,这个程序就可以正常运行了,2台电脑连个局域网,能实现聊天的功能
    不绑定指定IP就默认绑定本机IP吧,我想
      

  6.   

    你上边说IP和端口号都是由对话框输入的,由对话框输入后取出的是字符串类型,直接赋给整型的话,可能是只把字符串的第一个字符的ASCII码值赋过去,所以我怀疑没有转换就直接赋值了。如果不是这个问题,我的书上判断bind函数是这么写的:
    if(bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr))==SOCKET_ERROR) 

       MessageBox("绑定失败"); 
       return; 
    }
    我不清楚bind成功会返回什么值,你可以试试。另外未经绑定就能用套接字?我的书上只写了客户端可以这么用,你的是服务器端,看来也行了!
      

  7.   

    没有初始化。
    要用WSAStartUP....WSAClear
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 2, 2 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
    /* Tell the user that we couldn't find a useable */
    /* winsock.dll. */
    return;
    }
      

  8.   

    MFC使用函数AfxSocketInit包装了函数WSAStartup,在WinSock应用程序的初始化函数IninInstance中调用AfxSocketInit进行初始化。程序不必调用WSACleanUp。
      

  9.   

    bind()在函数执行成功返回是0,失败返回是SOCKET_ERROR;
    至于服务器绑定地址,我的意思这里是默认绑定本机IP而不是不绑定
      

  10.   

    在IninInstance中 初始化套接字了WSADATA wsd;
    WSAStartup(MAKEWORD(2,2),&wsd);
      

  11.   

    WSAGetLastError()看看是不是端口已经存在之类的错误或IP地址非法,跟踪下