Windows 套接字 accept() 返回错误的值

Windows sockets accept() returning wrong value

本文关键字:错误 返回 套接字 accept Windows      更新时间:2023-10-16

在我的程序的服务器端,当程序点击接受函数时,它会等待连接。找到传入的连接后(在我与客户端连接到它之后),accept() 方法返回 1。基于该返回,它尝试接收并发送到套接字 1,这是一个错误的套接字。

这是我服务器的一些代码:

for(;;)
{
   if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)  != SOCKET_ERROR) 

找到连接后,sConnect 的值为 1。

为什么会这样?我该如何解决它?

在Windows上,如果accept()失败,它将返回INVALID_SOCKET,而不是SOCKET_ERROR

真正的问题是您的if()语句同时执行赋值和比较,但它缺少赋值所需的一组括号,因此它实际上是在比较与您预期的值不同的值。 请改为执行以下操作:

if( (sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)) != INVALID_SOCKET )

更好的选择是将分配和比较分开:

sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != INVALID_SOCKET )  

因为您将返回的值acceptSOCKET_ERROR进行比较,并将此布尔值分配给sConnect

if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)  != SOCKET_ERROR) 

就个人而言,我不喜欢这么长的队伍。将分配和比较分开:

sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != SOCKET_ERROR )
...

或至少添加括号。

试试这个:

sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect  != INVALID_SOCKET)