gpt4 book ai didi

c++ - 客户端套接字可绑定(bind)但不可连接,因为已在使用中

转载 作者:可可西里 更新时间:2023-11-01 02:50:00 27 4
gpt4 key购买 nike

我写了一个客户端,我必须在其中绑定(bind)客户端套接字。这很好用。之后,我尝试连接套接字,但出现错误 10048。(地址已在使用中。)我不明白这怎么可能。

我必须实现一个与多个服务器对话的客户端。每个服务器只接受来自特定端口的消息。 (每个服务器都需要一个不同的端口)。所以我必须绑定(bind)我的客户端套接字。上面的代码是创建这些套接字之一。我的代码有时有效。但是很多时候连接给我错误10048,而之前的绑定(bind)没问题。我知道如果套接字已在使用中,绑定(bind)也会给出错误 10048。但事实并非如此。它返回 0。所以我猜端口是空闲的。绑定(bind)后我立即调用连接并收到错误 10048。我不明白为什么?在绑定(bind)的那一刻,端口显然是免费的。

bool TEthernetSocket::Open()
{
WSADATA wsaData;

if (WSAStartup((MAKEWORD(2, 0)), &wsaData) == SOCKET_ERROR)
{
return IsConnected();
}

Socket = socket(AF_INET, SOCK_STREAM, 0); // TCP

if (Socket == INVALID_SOCKET)
{
return false;
}

//bind Socket
struct sockaddr_in sa_loc;
memset(&sa_loc, 0, sizeof(struct sockaddr_in));
sa_loc.sin_family = AF_INET;
sa_loc.sin_port = htons(ClientPort);
sa_loc.sin_addr.s_addr = inet_addr(IPClient.substr(0, 15).c_str());

CALL_TRACE_CB("ethernetSocket connected");

if (!(bind(Socket, (struct sockaddr*)&sa_loc, sizeof(struct
sockaddr))))
{
CALL_TRACE_CB("Bind works");
}
else
{
AnsiString msg = AnsiString().sprintf("EN: error socket Bind:
%d", WSAGetLastError());
CALL_ERROR_CB(ERROR_NO_PORT_HANDLE, msg.c_str());
Close();
}


// TCP
SOCKADDR_IN sAdd;
sAdd.sin_family = AF_INET;
sAdd.sin_port = htons(Port);
sAdd.sin_addr.s_addr = inet_addr(IP.substr(0, 15).c_str());

if (connect(Socket, (SOCKADDR*)&sAdd, sizeof(SOCKADDR_IN)) ==
SOCKET_ERROR)
{
AnsiString msg = AnsiString().sprintf("EN: error connect
errorcode: %d", WSAGetLastError());
}
}

我希望 bind() 在 connect 返回此错误之前返回 10048,但实际上只有 connect() 返回此错误

最佳答案

I have to implement a client speaking with multiple server. The server only accepts messages from a specific port, so i have to bind my client socket.

这是一个无解的问题。当您建立出站 TCP 连接时,本地 IP 地址和端口的组合专门为该特定出站 TCP 连接保留。如果您需要从同一个端口建立多个出站 TCP 连接,每个都必须绑定(bind)到自己的本地 IP 地址。这将非常不方便。

还有其他问题。假设您完成了一个连接,然后尝试开始一个新连接。新的将具有相同的本地 IP 地址、本地端口(因为服务器只允许一个)、远程 IP 地址和远程端口。如何将来自新连接的数据包与来自旧连接的陈旧数据包区分开来?

这就是当您尝试连接 时出现错误的原因。直到知道连接的所有四个参数(本地和远程地址以及本地和远程端口),才能检测到与先前连接的冲突。在您调用 connect 之前,这是未知的。

您需要修复服务器以忽略源端口。如果绝对不能做到这一点,您将不得不采用等待和重试机制来处理与过去连接的冲突。

关于c++ - 客户端套接字可绑定(bind)但不可连接,因为已在使用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56636398/

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