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完成操作。未进行制造块的操作。