bool CChatDlg::InitSocket()
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox(_T("套接字创建失败!"));
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(6000);//端口号
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
CString error;
int errornum;
int retval;
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
int temp;
temp=WSAGetLastError();
error.Format(_T("%d"),temp);
AfxMessageBox(error);
closesocket(m_socket);
MessageBox(_T("绑定失败!"));
return FALSE;
}
return TRUE;
}
上述代码端口号为6000,在我的电脑上会弹出10048错误,当我把端口号改成8080,问题就解决了。
我们也可以在代码中加入判断,把端口号声明为整形变量port,如下代码所示:
while((errornum=WSAGetLastError())==10048)
{
port++;
addrSock.sin_port=htons(port);
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
}
附上用WSAGetLastError()获得的socket编程中常见错误(摘自MSDN)
常数值描述sckOutOfMemory7内存不足
sckInvalidPropertyValue380属性值无效。
sckGetNotSupported394属性不可读。
sckSetNotSupported383属性是只读的。
sckBadState40006所请求的事务或请求本身的错误协议或者错误连接状态。
sckInvalidArg40014传递给函数的参数格式不确定,或者不在指定范围内。
sckSuccess40017成功。
sckUnsupported40018不受支持的变量类型。
sckInvalidOp40020在当前状态下的无效操作
sckOutOfRange40021参数越界。
sckWrongProtocol40026所请求的事务或请求本身的错误协议
sckOpCanceled1004取消操作。
sckInvalidArgument10014所请求的地址是广播地址,但未设置标记。
sckWouldBlock10035套接字不成块,而指定操作将使之成块。
sckInProgress10036制造块的 Winsock 操作在进行之中。
sckAlreadyComplete10037完成操作。未进行制造块的操作。