套接字没有创建win32 c++
Posted
技术标签:
【中文标题】套接字没有创建win32 c++【英文标题】:socket not creating win32 c++ 【发布时间】:2015-11-02 14:00:52 【问题描述】:我正在创建一个套接字。它第一次很容易工作,然后我停止套接字并重新生成它给我错误
class MainServer
private:
SOCKET soo;
public:
// I have Basically Created Server Socket in this Function
// And passed it
SOCKET socket_control_mob()
struct sockaddr_in server;
WSADATA wsa;
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
printf("Failed. Error Code : %d", WSAGetLastError());
MessageBox(NULL, TEXT("Failed"), L"Failed", NULL);
soo = NULL;
return soo;
printf("Initialised.\n");
//MessageBox(NULL, TEXT("Initialised"), L"Simple Message", NULL);
//Create a socket
if ((soo = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
printf("Could not create socket : %d", WSAGetLastError());
MessageBox(NULL, TEXT("Socket Not Created1"), L"Failed", NULL);
soo = NULL;
return soo;
printf("Socket created.\n");
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8890);
//Bind
if (bind(soo, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
printf("Bind failed with error code : %d", WSAGetLastError());
MessageBox(NULL, TEXT("Binding Error"), L"Failed", NULL);
soo = NULL;
return soo;
puts("Bind done");
//MessageBox(NULL, TEXT("Bind Done"), L"Simple Message", NULL);
return soo;
bool server_close_socket()
closesocket(soo);
WSACleanup();
return true;
;
我通过调用创建了一个套接字
MainServer s;
s.socket_control_mob()
我已经停止了套接字
s.server_close_socket()
套接字停止后不创建
【问题讨论】:
您在两次运行之间等待多长时间?究竟出了什么问题? 第一次执行套接字我没有收到任何错误第二次弹出“套接字未创建1”消息并且套接字未创建。我在 5 秒后停止套接字并重新创建套接字然后我得到错误WSAGetLastError()
的值是多少?
我得到 WSAGetLastError() 的值为 6
错误 6 (ERROR_INVALID_HANDLE
) 不是 WinSock 错误代码。 WinSock 错误超过 10000 个。此外,如果bind()
失败,您的代码会泄漏SOCKET
。一旦socket()
返回一个有效的套接字,您必须在使用完毕后调用closesocket()
来释放它。如果bind()
失败,您必须关闭它。而soo = NULL
完全是错误的,您必须改用soo = INVALID_SOCKET
。并且server_close_socket()
应该在关闭套接字后设置soo = INVALID_SOCKET
。
【参考方案1】:
您错误地处理了套接字,甚至是 WinSock 库本身。尝试更多类似的方法:
class MainServer
private:
SOCKET soo;
bool init;
public:
MainServer()
: soo(INVALID_SOCKET), init(false)
WSADATA wsa;
printf("\nInitialising Winsock...");
int err = WSAStartup(MAKEWORD(2, 2), &wsa);
if (err != 0)
printf("Failed. Error Code : %d\n", err);
MessageBox(NULL, L"WSAStartup Failed", L"Failed", NULL);
else
init = true;
printf("Initialized.\n");
//MessageBox(NULL, L"Initialized", L"Simple Message", NULL);
~MainServer()
close_server_socket();
if (init)
WSACleanup();
SOCKET socket_control_mob()
struct sockaddr_in server = 0;
close_server_socket();
//Create a socket
soo = socket(AF_INET, SOCK_STREAM, 0);
if (soo == INVALID_SOCKET)
printf("Could not create socket. Error Code : %d\n", WSAGetLastError());
MessageBox(NULL, L"Socket Not Created", L"socket Failed", NULL);
return INVALID_SOCKET;
printf("Socket created.\n");
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8890);
//Bind
if (bind(soo, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
printf("Bind failed. Error Code : %d", WSAGetLastError());
MessageBox(NULL, L"Binding Error", L"bind Failed", NULL);
close_server_socket();
return INVALID_SOCKET;
printf("Bind done.\n");
//MessageBox(NULL, L"Bind Done", L"Simple Message", NULL);
return soo;
void server_close_socket()
if (soo != INVALID_SOCKET)
closesocket(soo);
soo = INVALID_SOCKET;
;
【讨论】:
【参考方案2】:这是众所周知的事情。您创建的套接字处于 FIN_WAIT 状态。为避免此问题,请等待 2 分钟后再重新运行程序,遵循“优雅关闭”协议或为套接字提供 SO_REUSEADDR 选项。
【讨论】:
@ElderBug OP 确实做到了。然而,看到这个问题出现了数百万次,我有理由怀疑 OP 误解了这个问题。想打赌,比如说,50 的声誉? OP 说他得到“Socket Not Created1”。如果您阅读他的代码,当socket()
失败时会打印此错误,而不是bind()
。绑定是在那之后,并且不打印同样的东西。
如果我等待 2 分钟然后我没有收到任何错误但我无法从客户端发送请求以上是关于套接字没有创建win32 c++的主要内容,如果未能解决你的问题,请参考以下文章