gpt4 book ai didi

c++ - 使用 WinSock2 开发,CreateThread() 函数出错

转载 作者:太空宇宙 更新时间:2023-11-04 16:27:34 25 4
gpt4 key购买 nike

我开始开发我的工具,它在 TCP 级别与 net 一起工作,但遇到了以下问题:

  • 为Winsock的accept()函数创建线程

我用谷歌搜索并查找引用资料,到处都有关于创建新线程的信息:

  • 它的前缀必须是 DWORD WINAPI (unsigned long __stdcall)
  • 它必须接受 LPVOID 参数

并且此类函数将用作 CreateThread() 函数中的第三个参数作为 LPTHREAD_START_ROUTINE 结构。

但是编译后出现下一个错误:

(131):错误 C2664:“CreateThread”:无法将参数 3 从“DWORD (__stdcall Net::*)(LPVOID)”转换为“LPTHREAD_START_ROUTINE”

这是我的代码:

#include <iostream>
#include <Windows.h>

#pragma comment(lib, "Ws2_32.lib")

typedef struct Header
{
friend struct Net;

private:
WORD wsa_version;
WSAData wsa_data;

SOCKET sock;
SOCKADDR_IN service;

char *ip;
unsigned short port;

public:
Header(void)
{
wsa_version = 0x202;

ip = "0x7f.0.0.1";
port = 0x51;

service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(ip);
service.sin_port = htons(port);
}

} Header;

typedef struct Net
{
private:
int result;

void WSAInit(WSAData *data, WORD *wsa_version)
{
result = WSAStartup(*wsa_version, &(*data));

if(result != NO_ERROR)
{
std::cout << "WSAStartup() failed with the error: " << result << std::endl;
}
else
{
std::cout << (*data).szDescription << " " << (*data).szSystemStatus << std::endl;
}
}

void SocketInit(SOCKET *my_socket)
{
(*my_socket) = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if((*my_socket) == INVALID_SOCKET)
{
std::cout << "Socket initialization failed with the error: " << WSAGetLastError() << std::endl;
WSACleanup();
}
else
{
std::cout << "Socket initialization successful!" << std::endl;
}
}

void SocketBind(SOCKET *my_socket, SOCKADDR_IN *service)
{
result = bind((*my_socket), (SOCKADDR*)&(*service), sizeof(*service));

if(result == SOCKET_ERROR)
{
std::cout << "Socket binding failed with the error: " << WSAGetLastError() << std::endl;
closesocket((*my_socket));
WSACleanup();
}
else
{
std::cout << "Socket binding successful!" << std::endl;
}

result = listen(*my_socket, SOMAXCONN);

if(result == SOCKET_ERROR)
{
std::cout << "Socket listening failed with the error: " << WSAGetLastError() << std::endl;
}
else
{
std::cout << "Listening to the socket..." << std::endl;
}
}

void SocketAccept(SOCKET *my_socket)
{
SOCKET sock_accept = accept((*my_socket), 0, 0);

if(sock_accept == INVALID_SOCKET)
{
std::cout << "Accept failed with the error: " << WSAGetLastError() << std::endl;
closesocket(*my_socket);
WSACleanup();
}
else
{
std::cout << "Client socket connected!" << std::endl;
}

char data[0x400];
result = recv(sock_accept, data, sizeof(data), 0);
}

DWORD WINAPI Threading(LPVOID lpParam)
{
SOCKET *my_socket = (SOCKET*)lpParam;
SocketAccept(my_socket);
}

public:
Net(void)
{
Header *obj_h = new Header();

WSAInit(&obj_h->wsa_data, &obj_h->wsa_version);

SocketInit(&obj_h->sock);
SocketBind(&obj_h->sock, &obj_h->service);

HANDLE thrd = CreateThread(NULL, 0, &Net::Threading, &obj_h->sock, 0, NULL);

delete &obj_h;
}
} Net;

int main(void)
{
Net *obj_net = new Net();

delete &obj_net;

return 0;
}

最佳答案

你不能使用 C++ 非静态成员函数。

使用静态的

关于c++ - 使用 WinSock2 开发,CreateThread() 函数出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com