因此,我们有一个长期存在的商业产品,这已经很成熟,我以前从未见过这类问题.我们使用客户端程序将数据发送到服务器.有时,由于客户环境中的防火墙,我们允许最终用户指定要绑定的出站端口范围,但是,在我看到的这个特定问题中,我们没有这样做,并且正在使用端口0来执行绑定.从我读过的所有内容来看,这意味着选择一个随机端口.但我无法找到的是,这对内核/操作系统意味着什么.如果我要求一个随机端口,那么它是如何使用的呢?严格来说,只有src ip/src端口和dst ip/port的唯一配对才能使连接唯一.我相信可以使用相同的端口,如果与另一个目标IP通信,但也许这与此无关.
此外,这不会发生在所有客户的系统上,只有一些.因此,这可能是某种形式的负载相关问题.据我所知,系统相当繁忙.
这是我们正在使用的代码.我遗漏了一些用于windows的ifdef代码,并在绑定后省略了我们的操作.
_SocketCreateClient(Socket_pwtP sock, SocketInfoP sInfo )
{
int nRetries; /* number of times to try connect() */
unsigned short port;
BOOL success = FALSE;
BOOL gotaddr = FALSE;
char buf[INET6_ADDRSTRLEN] ="";
int connectsuccess =1;
int ipv6compat =0;
#ifdef SOCKET_SEND_TIMEOUT
struct timeval time;
#endif /* SOCKET_SEND_TIMEOUT */
nRetries = sInfo->si_nRetries;
sock->s_hostName = strdup(sInfo->si_hostName);
#ifdef DEBUG_SOCKET
LogWrite(LogF,LOG_WARNING,"Socket create client");
LogWrite(LogF,LOG_WARNING,"Number of retries = %d", nRetries);
#endif
ipv6compat = GetIPVer();
if (ipv6compat == -1) /* ipv6 not supported */ …
Run Code Online (Sandbox Code Playgroud)