【问题标题】:send() function is not working [duplicate]发送()函数不起作用[重复]
【发布时间】:2013-11-15 14:14:39
【问题描述】:

我正在做一个套接字程序,通过发送十六进制消息与视频服务器控件进行通信。我尝试了很多次,弄清楚发生了什么,但我还没有发现错误。

这是我完成的代码:

void UsingWinSock()
{
    u_short port;
    int ret;
    struct sockaddr_in my_addr;
    int lenAddrs;
    CString remoteAddress;

    b1 = 192;
    b2 = 168;
    b3 = 11;
    b4 = 2;

    remoteAddress.Format("%u.%u.%u.%u", b1, b2, b3, b4);

    port = (u_short)(portNumber);

    // remote address
    memset(&remote_addr, 0, sizeof(remote_addr));
    remote_addr.sin_family = PF_INET;
    remote_addr.sin_port = htons(port);
    inet_pton(AF_INET, remoteAddress, (&remote_addr.sin_addr)); 

    // socket 
    sckSloMo = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (sckSloMo == INVALID_SOCKET)
    {
        AfxMessageBox("sckSloMo is invalid!!");
        return;
    }

    if (sckSloMo != SOCKET_ERROR)
    {
        ret = connect(sckSloMo, (const sockaddr*) &remote_addr, sizeof(remote_addr));

        if (ret != SOCKET_ERROR)
        {
            m_status = "Connected!!";
            SetDlgItemText(IDC_STATIC_STATUS, m_status);
        }
        else
        {
            m_status = "connect error!!!";
            SetDlgItemText(IDC_STATIC_STATUS, m_status);
            OnBnClickedButtonCancel();
        }
    }
    else if (ret == SOCKET_ERROR)
    {
        AfxMessageBox("socket not Ok");
        return;
    }

}

void StartSendingMessages()
{
    int retorno;
    const int bufLen = 7;
    CString TextRetorno;
    CString messageSend;

    HEX_bufferMessage = new CHAR[bufLen]; // alocando espaço

    // specifies the led state
    HEX_bufferMessage[0] = 0xF0;
    HEX_bufferMessage[1] = 0x15;
    HEX_bufferMessage[2] = 0x31;
    HEX_bufferMessage[3] = 0x04;
    HEX_bufferMessage[4] = 0x02; // green
    HEX_bufferMessage[5] = 0x0E; // C1
    HEX_bufferMessage[6] = 0xF7;

    retorno = send(sckSloMo, HEX_bufferMessage, bufLen, 0); 

    if (retorno == SOCKET_ERROR || retorno < 0 || retorno == INVALID_SOCKET)
    {
        AfxMessageBox("Error Send!!");
        return;
    }
    else if(retorno != 0)
    {
        AfxMessageBox("Send() OK !!");
    }
}

未引发错误,但视频服务器控制器不执行任何操作。 有人知道我的程序发生了什么吗?

【问题讨论】:

  • 你在wireshark上看到了什么?
  • 旁白:为什么要为 HEX_bufferMessage 分配内存而不是使用静态数组? (char HEX_bufferMessage[bufLen];) 你的函数没有释放它,也没有发送。
  • 十六进制 不是数据类型。这是一种对数值进行编码以供显示和用作整数文字的方法。 0x1016020 都表示相同的值,其二进制表示为10000
  • 请不要大写 C++ 标识符,即使是句子或标题的第一个单词。这是send(),而不是Send()。 (我已经修好了。)
  • static const HEX_bufferMessage[] = { 0xF0, 0x15, 0x31, 0x04, 0x02, 0x0E, 0xF7 }; send(sckSloMo, HEX_bufferMessage, sizeof(HEX_bufferMessage), 0);(并完全删除 bufLen)[这不是修复,只是为了帮助您简化代码]

标签: c++ sockets mfc hex send


【解决方案1】:

尝试设置套接字选项“TCP_NODELAY”。您的消息太小,可能会延迟一段时间。

【讨论】:

  • 好的,我要试试这个。
  • 编译器说 TCP_NODELAY 是未声明的标识符。 =[
  • MSDN 说它定义明确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多