UDP套接字不读取数据包

时间:2020-08-10 07:44:46

标签: c sockets network-programming udp

所以我有一个连接到网卡的设备,它使用IPv4和UDP将数据发送到端口11678和地址192.168.121.1。我已经通过调用tcpdump检查设备是否确实使用IPv4和UDP发送到该端口和地址。但是我的C套接字没有收到任何数据包。下面我有一个最小的非工作示例,该示例仅运行无限循环直到收到一个数据包。即使tcpdump可以接收任何数据包,所以我认为我的代码有问题。

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

#define DEST_ADDR "192.168.121.1"
#define DEST_PORT 11678
#define PACKET_MAXSIZE 1024

int main(int argc, char **argv) {
    struct sockaddr_in dest_addr;
    bzero(&dest_addr, sizeof(dest_addr));
    dest_addr.sin_family = AF_INET;

    /* create socket */
    int fd = socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, 0); // use SOCK_NONBLOCK?
    if (fd < 0) {
        perror("Could not create socket.");
    }

    /* bind port and address to socket */
    dest_addr.sin_port = htons(DEST_PORT);
    inet_aton(DEST_ADDR, &dest_addr.sin_addr);
    int rc = bind(fd, (struct sockaddr*) &dest_addr, sizeof(dest_addr));
    if (rc != 0) {
        perror("Could not bind socket to local address");
    }

    /* read packets */
    void* buf;
    posix_memalign(&buf, 4096, 1024);
    while (true) {
        ssize_t read_size = read(fd, buf, PACKET_MAXSIZE);
        printf("%d\n", read_size);
        if (read_size > 0) {
            break;
        }
    }

    return 0;
}

read仅返回-1,并且在每次迭代中将errno设置为11(EAGAIN)。任何帮助表示赞赏。预先感谢。

1 个答案:

答案 0 :(得分:1)

如果您使用的是iptables系统,请检查是否没有丢弃数据包。 tcpdump将显示进入iptables之前进入的数据包。

另一件事是,您应该使用epollselect以更受控制的方式从套接字读取。 EAGAIN不一定是错误的:它只是意味着没有数据。但是您在循环时不停地等待着它,所以我希望有很多EAGAIN,直到有东西真正到达港口为止。

相关问题