gpt4 book ai didi

c++ - 将套接字传递给线程 C

转载 作者:太空狗 更新时间:2023-10-29 23:53:22 24 4
gpt4 key购买 nike

我正在尝试使用 UDP 制作网络系统。我已经设法让它工作了,但现在我想将监听部分放在一个单独的线程中,这样我就可以继续执行程序而不必等待消息(它将用于游戏)。

问题是,当我将套接字传递给新线程并使用它进行监听时,它不起作用,只是不断接收随机输入。当我在初始化套接字的方法中使用完全相同的代码时,一切正常。

这个有效:

bool serverUDP() {
WSADATA w;
SOCKET sd;

struct sockaddr_in server, client;
char buffer[DEFAULT_BUFLEN];
int bytes_received;
int client_length;

/* Open windows connection */
if (WSAStartup(MAKEWORD(2,2)/*0x0101*/, &w) != 0) {
fprintf(stderr, "Could not open Windows connection.\n");
return false;
}

/* Open a datagram socket */
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (sd == INVALID_SOCKET) {
fprintf(stderr, "Could not create socket.\n");
WSACleanup();
return false;
}

/* Clear out server struct */
memset((void *)&server, '\0', sizeof(struct sockaddr_in));

/* Set family and port */
server.sin_family = AF_INET;
server.sin_port = htons(atoi(DEFAULT_PORT));

server.sin_addr.S_un.S_un_b.s_b1 = 127;
server.sin_addr.S_un.S_un_b.s_b2 = 0;
server.sin_addr.S_un.S_un_b.s_b3 = 0;
server.sin_addr.S_un.S_un_b.s_b4 = 1;

/* Bind address to socket */
if (bind(sd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1) {
fprintf(stderr, "Could not bind name to socket.\n");
closesocket(sd);
WSACleanup();
return false;
}

client_length = (int)sizeof(struct sockaddr_in);

/* Receive bytes from client */
while (true) {
bytes_received = recvfrom(sd, buffer, DEFAULT_BUFLEN, 0, (struct sockaddr *)&client, &client_length);
fprintf(stderr,"received: %s\n", buffer);
}

closesocket(sd);
WSACleanup();

return true;
}

这不是:

bool serverUDP() {
WSADATA w;
SOCKET sd;

struct sockaddr_in server, client;
char buffer[DEFAULT_BUFLEN];
int bytes_received;
int client_length;

/* Open windows connection */
if (WSAStartup(MAKEWORD(2,2)/*0x0101*/, &w) != 0) {
fprintf(stderr, "Could not open Windows connection.\n");
return false;
}

/* Open a datagram socket */
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (sd == INVALID_SOCKET) {
fprintf(stderr, "Could not create socket.\n");
WSACleanup();
return false;
}

/* Clear out server struct */
memset((void *)&server, '\0', sizeof(struct sockaddr_in));

/* Set family and port */
server.sin_family = AF_INET;
server.sin_port = htons(atoi(DEFAULT_PORT));

server.sin_addr.S_un.S_un_b.s_b1 = 127;
server.sin_addr.S_un.S_un_b.s_b2 = 0;
server.sin_addr.S_un.S_un_b.s_b3 = 0;
server.sin_addr.S_un.S_un_b.s_b4 = 1;

/* Bind address to socket */
if (bind(sd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1) {
fprintf(stderr, "Could not bind name to socket.\n");
closesocket(sd);
WSACleanup();
return false;
}

_beginthread((void(*)(void*))receiveThread,0,(void *)sd);

closesocket(sd);
WSACleanup();

return true;
}

void receiveThread(SOCKET sd)
{
struct sockaddr_in client, server;
char buffer[DEFAULT_BUFLEN];

int bytes_received;
int client_length;

client_length = (int)sizeof(struct sockaddr_in);

while (true) {
bytes_received = recvfrom(sd, buffer, DEFAULT_BUFLEN, 0, (struct sockaddr *)&client, &client_length);
fprintf(stderr,"received: %s\n", buffer);
}
}

第二段代码只是随机输入垃圾邮件,就好像它不断收到一些奇怪的消息一样。第一段代码等待消息并在收到消息时继续(我也有一个客户端部分)。

感谢您的帮助!

干杯,

马克西姆舒梅克

最佳答案

主线程在启动另一个线程后立即关闭套接字。因此该线程不再具有有效的套接字句柄。

关于c++ - 将套接字传递给线程 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265684/

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