gpt4 book ai didi

c++ - Winsock2 : "listen" returns early

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

我是 winsock2 的新手,并为我试图用来向我在同一台计算机上运行的客户端(连接到 127.0.0.1 的客户端)发送字符串的服务器编写了以下代码与服务器相同的端口设置为监听)。

如果重要的话,我正在使用 MinGW。

我遇到的问题是 listen() 似乎提早完成但返回成功代码。这是一个问题,因为当调用 accept() 时它似乎永远阻塞。无论我是否正在运行客户端程序,都会发生此事件,并且我已经尝试过在前后运行客户端程序,但这似乎并不影响它。

// -1: "Could not initialize WSA."
// -2: "Could not create listener socket."
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <cstdio>
#define port 0x0ABC
UINT64 trStrLen (char* str)
{
if (str == NULL) return 0;
UINT64 pos = 0;
while (*(str + pos) != '\0') pos++;
return pos;
};
#include <cstdio>
int main ()
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2,0),&wsadata)) return -1;
SOCKET server = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN sin;
memset(&sin,0,sizeof(SOCKADDR_IN));
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = INADDR_ANY;
int socksize = sizeof(SOCKADDR);
while (bind(server,(SOCKADDR*)(&sin),socksize) == SOCKET_ERROR) return -2;
char* TEMP_TO_SEND = "Billy Mays does not approve.";
UINT64 TEMP_SEND_LEN = trStrLen(TEMP_TO_SEND);
printf("Server online.\n");
while (true)
{
printf("Waiting for connections.\n");
while (listen(server,SOMAXCONN) == SOCKET_ERROR);
printf("Client requesting connection.\n");
SOCKET client = accept(server,NULL,NULL);
printf("Accept is no longer blocking.\n");
if (client != INVALID_SOCKET)
{
printf("Attempting to send information to the client...\n");
if (send(client,TEMP_TO_SEND,TEMP_SEND_LEN,0) == SOCKET_ERROR) printf("The information wasn't sent properly.\n");
else printf("The client received the information.\n");
}
else printf("Couldn't establish a connection to the client.\n");
};
};

这可能是显而易见的事情,但我没有看到,所以任何提示都会有所帮助。

最佳答案

listen() 不是阻塞调用。它对网络没有任何作用。它只是将套接字置于被动监听模式,设置积压队列,然后返回。 accept() 是阻塞调用:它阻塞直到传入连接完成,然后为其返回一个套接字。

所以你根本不应该在 while 循环中调用 listen()

同样适用于 bind()。调用一次。

关于c++ - Winsock2 : "listen" returns early,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205801/

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