0

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

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

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

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

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

4

3 回答 3

5

在 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 )  
于 2013-10-08T18:29:43.610 回答
3

因为您将按值返回的accept值与SOCKET_ERROR将此布尔值进行比较并将其分配给sConnect

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

就个人而言,我不喜欢这么长的线路。分离赋值和比较:

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

或至少添加括号。

于 2013-10-08T18:28:04.097 回答
1

尝试这个:

sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect  != INVALID_SOCKET)
于 2013-10-08T18:32:57.180 回答