【问题标题】:Socket Send error套接字发送错误
【发布时间】:2009-12-10 10:57:00
【问题描述】:

我正在使用 unix 套接字。当缓冲区发送到套接字时,它给了我未知的错误 196。 请帮忙。

BOOL SendData(int iBuffer)
{
    //Send data over socket
    int nRet = send(m_listenSock, m_cBuffer, iBuffer, 0);

    if(SOCKET_ERROR > nRet)
    {
        //log the error char temp;
        int length= sizeof(int);
        int rc = getsockopt(m_listenSock,SOL_SOCKET,SO_ERROR,&temp,(socklen_t *)&length);

        //if(rc == 0)
        {
            errno = temp;
            perror("\nError is");
        }

#ifndef LINUX
        WSACleanup();
#else
        close(m_listenSock);
#endif

        printf("\nSend data failed to");

        return FALSE;
    }

    return TRUE;
}

【问题讨论】:

  • 贴出导致问题的代码

标签: c++ linux sockets


【解决方案1】:

如果设置了errno,但调用没有失败(即它没有返回-1),那么errno 的值与你最后一次调用无关。您可以先尝试清除:

errno = 0;

为了安全起见。我想说的是,您无法知道 errno 的值是相关的,除非在设置它的调用之后。您必须检查所有可能失败的调用是否成功/失败。

【讨论】:

    【解决方案2】:

    要检测错误,您应该检查 send 返回 -1。我不知道 SOCKET_ERROR 是什么,但是如果它是 -1,那么上面的代码无论如何都不会正常工作。

    假设你确实从 send() 中得到 -1,那么错误代码将在 errno 中。不需要执行 getsockopt 来检索它。

    没有错误代码 196,所以我对您的错误处理深表怀疑。

    另外,如果 send() 失败,您可能不应该关闭套接字。您没有指定地址族或套接字类型,但我假设分别为 AF_INET 和 SOCK_DGRAM(即 UDP)

    【讨论】:

    • SOCKET_ERROR == -1 = true
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2018-12-14
    相关资源
    最近更新 更多