【问题标题】:Windows sockets accept() returning wrong valueWindows 套接字接受()返回错误值
【发布时间】:2013-10-08 18:25:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)周围添加一些括号
  • 我会写这 2 行代码以使代码更具可读性并避免此错误和编译器应为该代码发出的警告。

标签: c++ windows sockets networking


【解决方案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 )  

【讨论】:

    【解决方案2】:

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

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

    我个人不喜欢这么长的行。将赋值和比较分开:

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

    或至少添加括号。

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2012-09-14
        相关资源
        最近更新 更多