【问题标题】:UDP Listener in C not outputting correct hex informationC中的UDP侦听器未输出正确的十六进制信息
【发布时间】:2018-06-08 18:15:28
【问题描述】:

我正在尝试侦听特定端口 (6053),并且我想打印通过该端口的所有数据。但我似乎无法让我的程序正确运行,它输出错误数据/错误数据,因为它与来自线鲨的数据不匹配。如果有人对我应该前进的方向有任何意见或建议,将不胜感激!

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <WinSock2.h>
    #include <winsock.h>
    #include <string.h>
    #include <sys/types.h>
    #include <assert.h>

int main(void) {
sockaddr_in si_me, si_other;
int s;
assert((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) );//!= -1
int port = 6053;
int broadcast = 1;

setsockopt(s, SOL_SOCKET, SO_BROADCAST,
    (const char * )&broadcast, sizeof broadcast);

memset(&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = INADDR_ANY;

assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr)) );//!= -1

while (1)
{
    char buf[10000];
    int slen = sizeof(sockaddr);
    recvfrom(s, buf, sizeof(buf) - 1, 0, (sockaddr *)&si_other, &slen);

    printf("recv: %x\n", buf);
}

}

【问题讨论】:

    标签: c udp qudpsocket


    【解决方案1】:

    首先,您没有检查recvfrom 的返回结果,因此您的buf 数组可能包含与您描述的完全相同的错误数据/错误数据。例如,您能否检查 MSDN 文档(或任何其他 recvfrom 手册),因为它包含一个很好的起点: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740120(v=vs.85).aspx

    【讨论】:

      【解决方案2】:
      printf("recv: %x\n", buf);
      

      预计bufint,它以十六进制表示法打印。但是buf 不是int;这是char*(衰减后)。所以你在向printf 撒谎buf 的类型,导致未定义的行为。 UB 的一种可能表达方式是打印的十六进制值是缓冲区 地址 的最后 32 位,这肯定与接收到的数据没有任何关系。

      如果您使用 -Wall 编译,您的编译器会警告您。

      它也可能警告过您没有使用recvfrom 的返回值这一事实。由于 UDP 传输可能包含 NUL 字节(因此通常不是 C 字符串,不能包含 NUL),因此您需要知道收到了多少字节。 recvfrom 提供该信息作为其返回值,它还会告诉您是否存在错误。没有其他方法可以知道接收了多少字节,因此使用返回值实际上是强制性的。

      由于recvfrom收到的数据包不会被NUL终止,所以没有必要为NUL终止保留一个字节;它不会被使用。 (如果您知道数据包是字符串,并且希望缓冲区以 NUL 结尾,则必须自己使用 recvfrom 返回的长度来执行此操作。在这种情况下,您需要为字节。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-08
        • 2014-11-25
        • 1970-01-01
        • 2011-06-01
        • 2017-06-04
        • 2018-09-07
        • 1970-01-01
        • 2011-12-09
        相关资源
        最近更新 更多