先贴代码:   char szHostName[256];
int bRet;
int ir;
bRet = gethostname(szHostName, strlen(szHostName));
if (bRet == SOCKET_ERROR)
return FALSE;
sockaddr_in ipHost;
memset(&ipHost,0,sizeof(sockaddr_in));
struct hostent FAR * host;
host = gethostbyname(szHostName);
if (host == NULL)
{
return FALSE;
}
if (host->h_addrtype != AF_INET)
{
return FALSE;
} ipHost.sin_addr.S_un.S_un_b.s_b1 = host->h_addr_list[0][0];
ipHost.sin_addr.S_un.S_un_b.s_b2 = host->h_addr_list[0][1];
ipHost.sin_addr.S_un.S_un_b.s_b3 = host->h_addr_list[0][2];
ipHost.sin_addr.S_un.S_un_b.s_b4 = host->h_addr_list[0][3]; SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (hSocket == INVALID_SOCKET)
{
return FALSE;
} ipHost.sin_port = htons(prot);
ir = bind(hSocket, (sockaddr*)&ipHost, sizeof(ipHost));
if (ir == SOCKET_ERROR)
{
closesocket(hSocket);
return FALSE;
} BOOL bNoDelay = TRUE;
ir = setsockopt(hSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&bNoDelay, sizeof(bNoDelay));
if (ir == SOCKET_ERROR)
{
closesocket(hSocket);
//m_hSocket = INVALID_SOCKET;
return FALSE;
}
ir = listen(hSocket, SOMAXCONN);
if (ir == SOCKET_ERROR)
{
closesocket(hSocket);
return FALSE;
} return TRUE;
问题出现的地方:   ipHost.sin_addr.S_un.S_un_b.s_b1 = host->h_addr_list[0][0];
ipHost.sin_addr.S_un.S_un_b.s_b2 = host->h_addr_list[0][1];
ipHost.sin_addr.S_un.S_un_b.s_b3 = host->h_addr_list[0][2];
ipHost.sin_addr.S_un.S_un_b.s_b4 = host->h_addr_list[0][3];这样获取主机的IP(结构hostent 中)后,然后赋给ipHost(sockaddr_in结构),但发现,IP的4个段中,每个段中数字后面还有其他的字符,但如果不要这些字符,4个字段里的数字组合起来正是主机的IP  例如:主机的IP是:192.168.2.12    获取的结果(ipHost中)是:第一字段:192‘?
                第二字段:168’?
                第三:2‘?
                第四:12’? 
是什么地方出现了问题?还有一个问题: gethostbyname这个API获取的(可能)是多个IP  那到底哪个IP是当前主机的IP  这个是怎么区分的?
  

解决方案 »

  1.   

    取一个Byte(unsigned char)就好。
      

  2.   

    例如:主机的IP是:192.168.2.12    获取的结果(ipHost中)是:第一字段:192‘? 
                    第二字段:168’? 
                    第三:2‘? 
                    第四:12’? 你这个地方是通过vc调试界面看到的吧,它只是试图把数字用字符显示,没有关系的。
      

  3.   

    TO CNZDGS:
        但这样在ir = bind(hSocket, (sockaddr*)&ipHost, sizeof(ipHost)); 就出现了问题,即绑定不上 TO CWC270:  是通过VC的调试界面看到的  
      
      

  4.   

    不知道为什么会出现这个问题的既然是对的,为什么bind会失败啊
      

  5.   

    在bind之前加上这个
    ipHost.sin_family=AF_INET;
      

  6.   

    TO  CWC270:  还是不行啊  bing()的返回为-1
      

  7.   

    在我机器上测试,bind是成功的 char szHostName[256]; 
    int bRet; 
    int ir; 
    bRet = gethostname(szHostName, strlen(szHostName)); 
    if (bRet == SOCKET_ERROR) 
    return FALSE; 
    sockaddr_in ipHost; 
    memset(&ipHost,0,sizeof(sockaddr_in)); 
    struct hostent FAR * host; 
    host = gethostbyname(szHostName); 
    if (host == NULL) 

    return FALSE; 

    if (host->h_addrtype != AF_INET) 

    return FALSE; 


    ipHost.sin_family=AF_INET;//新加代码
    ipHost.sin_addr.S_un.S_un_b.s_b1 = host->h_addr_list[0][0]; 
    ipHost.sin_addr.S_un.S_un_b.s_b2 = host->h_addr_list[0][1]; 
    ipHost.sin_addr.S_un.S_un_b.s_b3 = host->h_addr_list[0][2]; 
    ipHost.sin_addr.S_un.S_un_b.s_b4 = host->h_addr_list[0][3]; 


    SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    if (hSocket == INVALID_SOCKET) 

    return FALSE; 


    ipHost.sin_port = htons(51234); 
    ir = bind(hSocket, (sockaddr*)&ipHost, sizeof(ipHost)); 
    if (ir == SOCKET_ERROR) 

    DWORD dErr = WSAGetLastError();
    closesocket(hSocket); 
    return FALSE; 


    BOOL bNoDelay = TRUE; 
    ir = setsockopt(hSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&bNoDelay, sizeof(bNoDelay)); 
    if (ir == SOCKET_ERROR) 

    closesocket(hSocket); 
    //m_hSocket = INVALID_SOCKET; 
    return FALSE; 

    ir = listen(hSocket, SOMAXCONN); 
    if (ir == SOCKET_ERROR) 

    closesocket(hSocket); 
    return FALSE; 


    return TRUE; 
      

  8.   

    WSAGetLastError看看Bind返回的错误代码是什么?然后再根据错误处理。