UDP C++接收

Posted

技术标签:

【中文标题】UDP C++接收【英文标题】:UDP c++ receive 【发布时间】:2018-03-01 06:30:00 【问题描述】:

我想通过 UDP 从设备发送/接收数据。该设备充当服务器,如果我向它发送一个值,它会向我发送一些值。首先我写了一个没有任何问题的python代码:

import socket
import time

UDP_IP = "192.168.42.33"
UDP_PORT = 5004    

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('',UDP_PORT))

while True:
    MESSAGE = input('Write new message: ')
    sock.sendto(bytes.fromhex(MESSAGE), (UDP_IP, UDP_PORT))
    time.sleep(0.1)
    data, addr = sock.recvfrom(1076)

    a = len(data)
    print ("Byte: ", data.hex()[46], data.hex()[47])

我可以使用此脚本将值写入寄存器,并从设备返回包含所有更新的寄存器值的数组。我用c++写了一个相等的程序:

#pragma once
#pragma comment(lib, "Ws2_32.lib") 

#include <sdkddkver.h> 
#include <WinSock2.h>
#include <Windows.h> 
#include <iostream> 
#include <string> 

#define SCK_VERSION2 0x0202 
#define BUFLEN 2048
using namespace std;

int main()

    int inputI;             
    long SUCCESSFUL;
    WSAData WinSockData;         
    WORD DLLVersion;
    SOCKET sock;
    char msg_input[] =  0x60, 0x01, 0x00, 0x00;   //Write REG mode, 1 byte
    char* SU_IP = "192.168.42.33";  //IP Address of Scanner Unit
    u_short SU_PORT = 5004;         //Port of Scanner Unit
    SOCKADDR_IN ADDRESS;
    char buf[BUFLEN];
    int slen = sizeof(ADDRESS);

    DLLVersion = MAKEWORD(2, 1);
    SUCCESSFUL = WSAStartup(DLLVersion, &WinSockData);

    sock = socket(AF_INET, SOCK_DGRAM, 0);
    ADDRESS.sin_addr.s_addr = inet_addr(SU_IP);
    ADDRESS.sin_family = AF_INET;
    ADDRESS.sin_port = htons(SU_PORT);

    connect(sock, (SOCKADDR*)&ADDRESS, sizeof(ADDRESS));

    while (1)
    
        cout << "Adresse des Registers (hex): ";
        cin >> hex >> inputI;
        msg_input[2] = inputI;
        cout << "Wert des Registers (hex): ";
        cin >> hex >> inputI;
        msg_input[3] = inputI;
        send(sock, msg_input, sizeof(msg_input), NULL);
        //recv(sock, buf, BUFLEN, 0);
       

我能够发送值并且设备将其寄存器值发回以便通信正常进行(我使用wireshark检查了这一点)。但我无法在我的程序中接收数据。我注释了 recv 函数,因为如果我想接收,程序会卡在这一点上。 recvfrom() 函数此时也不起作用。我尝试了 bind() 函数而不是 connect,因为在 python 脚本中它与 sock.bind 一起使用。但比我不能发送或接收。我正在阅读几篇关于 UDP 接收功能的帖子,但找不到我的错误。有人可以帮我吗?

【问题讨论】:

一些错误处理在您的情况下会很有用 谁将响应发送回您的 C 代码?您是否希望收到您使用 C 代码发送的数据包? @Daniel 根据 OP,它是一个位于 IP 地址 192.168.42.33 的设备(评论说“扫描仪单元”)。不,他不希望收到他发送的数据包,他希望收到来自设备的响应。 send(以及socketconnect)的返回值是多少? 【参考方案1】:

Python 代码绑定到端口 5004 上的所有现有本地接口,而 C 代码将在调用 connect() 期间隐式绑定到本地空闲端口,因此如果远程对等方被硬编码以响应端口 5004 , 套接字将不会接收它。

您应该在创建套接字后立即添加对 bind() 的调用:

bind(sock, (sockaddr *)&ADDRESS, sizeof(ADDRESS));

看看会发生什么:)

【讨论】:

感谢您的回复。我使用了 bind() 函数并像 Jean-Bernard Jansen 所说的那样添加了错误处理。绑定套接字时出现错误代码 10049,这意味着地址不可用。但地址必须可用。 在MSDN 中的快速检查显示此错误意味着您正在尝试将套接字绑定到“对本地计算机无效的地址”。在命令提示符下运行“ipconfig”并检查为您的网络接口分配了哪些 IP 地址。 ADDRESS.sin_addr.s_addr 在调用connect() 时设置为设备的IP。客户端不能bind() 到该IP 地址。在connect() 之前调用bind() 时,请确保将ADDRESS.sin_addr.s_addr 设置为INADDR_ANY(如果不是特定的本地IP)。

以上是关于UDP C++接收的主要内容,如果未能解决你的问题,请参考以下文章

UDP 测试代码不接收消息 (C++)

C++ Boost UDP接收器在放入线程时失败

从 C++ UDP 缓冲区接收字符串

如何在 Raspberry Pi 上使用 C++ 将接收到的 UDP 音频数据正确写入 ALSA

C++ UDP客户端/套接字编程:不能发送和接收

c++ h264RTP接收和发送程序