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

时间:2013-10-08 18:25:04

标签: c++ windows sockets networking

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

以下是我服务器的一些代码:

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

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

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

3 个答案:

答案 0 :(得分: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 )  

答案 1 :(得分:3)

因为您将accept值返回的值与SOCKET_ERROR进行比较,并将此布尔值指定给sConnect

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

我个人不喜欢这么长的路线。分配作业和比较:

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

或至少添加括号。

答案 2 :(得分:1)

试试这个:

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