【问题标题】:Problem in using a second call to send() in C在 C 中使用第二次调用 send() 时出现问题
【发布时间】:2011-02-26 04:06:15
【问题描述】:

现在我在一个简单的服务器上工作,它从客户端接收一个引用某个操作的代码。服务器接收此数据并发送回它正在等待正确数据的信号。

                   /*Server Side*/
                    if (codigoOperacao == 0)
                    {
                        printf("A escolha foi 0\n");
                        int bytesSent = SOCKET_ERROR;
                        char sendBuff[1080] = "0";
                        /*Here "send" returns an error msgm while trying to send back the signal*/
                        bytesSent = send(socketEscuta, sendBuff, 1080, 0);
                        if (bytesSent == SOCKET_ERROR)
                        {
                            printf("Erro ao enviar");
                            return 0;
                        }
                        else
                        {
                        printf("Bytes enviados : %d\n", bytesSent);
                        char structDesmontada[1080] = "";
                        bytesRecv = recebeMensagem(socketEscuta, structDesmontada);
                        printf("structDesmontada : %s", structDesmontada);
                        }
                    }

这里是负责发送操作码和接收信号的客户端代码

                char sendMsg[1080] = "0";
            char recvMsg[1080] = "";
            bytesSent = send(socketCliente, sendMsg, sizeof(sendMsg), 0);
            printf("Enviei o codigo (%d)\n", bytesSent);
            /*Here the program blocks in a infinite loop since the server never send anything*/
            while (bytesRecv == SOCKET_ERROR)
            {
            bytesRecv = recv(socketCliente, recvMsg, 1080, 0);
            if (bytesRecv > 0)
            {
                printf("Recebeu\n");
            }

为什么只有在第二次尝试发送数据时才会发生这种情况?因为第一次调用 send() 工作正常。 希望有人能帮忙!! 谢谢

【问题讨论】:

  • 自从我使用 c 套接字以来已经有好几年了,但是您是否尝试过使用 NON_BLOCK 标志?顺便说一句,您使用的是哪种插座?
  • 错误信息是什么?
  • SOCKET_ERROR。我正在使用 TCP 连接。我认为 NON_BLOCK 不会解决问题,因为我在使用 send() 时遇到问题并且它没有阻塞:P。不过谢谢。编辑:正如我所想,NON_BLOCK 没用 sigh
  • 应该有一个更具描述性的错误,虽然我对windows并不特别熟悉;你会在 BSD 上使用 errno 来获取它。尽管您发送的是未初始化的字节,但您的代码一目了然。
  • 客户端收到第一条“消息”了吗?

标签: c windows tcp client-server send


【解决方案1】:

我整理好了。第一个接收缓冲区对于传入的消息来说太小了,它溢出了,擦除了 SOCKET socketEscuta 变量。现在它工作正常。感谢您的提示!

【讨论】:

    猜你喜欢
    • 2021-02-19
    • 2021-02-21
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多