先贴代码: 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 这个是怎么区分的?
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 这个是怎么区分的?
第二字段:168’?
第三:2‘?
第四:12’? 你这个地方是通过vc调试界面看到的吧,它只是试图把数字用字符显示,没有关系的。
但这样在ir = bind(hSocket, (sockaddr*)&ipHost, sizeof(ipHost)); 就出现了问题,即绑定不上 TO CWC270: 是通过VC的调试界面看到的
ipHost.sin_family=AF_INET;
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;