套接字未创建win32 c++
socket not creating win32 c++
我正在创建一个套接字。它第一次很容易工作,然后我停止套接字并重新生成它给我错误
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()
套接字在停止后不会创建
您处理套接字,甚至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 : %dn", 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 : %dn", 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;
}
}
};
这是众所周知的事情。您创建的套接字处于FIN_WAIT状态。为了避免这个问题,在重新运行程序之前等待2分钟,遵循"优雅关闭"协议或为套接字提供SO_REUSEADDR选项。
相关文章:
- Win32编译器选项和内存分配
- C++win32 API创建多个类似视口的窗口
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- 检测win32服务创建和删除的最佳方法
- WIN32:C++,为什么在WM_CLOSE上调用Messagebox函数程序正在冻结
- 将 win32 hbitmap 转换为 winrt softwarebitmap
- 使用 WIN32 API (C/C++) 对特定树视图项进行着色
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- VSCode C++ 编译的exe感染了Win32:TrojanX-gen[Trj]
- 从预处理器获取 Windows 版本(C++ Win32)
- Issues with Win32 ReadProcessMemory API
- Win32 发送输入鼠标移动滞后并冻结
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 将 Win32/WinAPI 应用程序移植到 wxWidgets
- Win32 API 控制台光标在 WriteConsole 后不移动
- C++ Win32 Threads
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 如何在 Win32 C++控制台应用程序中调用 UWP 类库