无法在 matlab 中的 UDP 客户端和 Linux 中的服务器之间发送数据

Not able to send data between UDP client in matlab and server in linux

本文关键字:服务器 之间 数据 Linux matlab 中的 客户端 UDP      更新时间:2023-10-16

我在一台机器的 matlab 中有 UDP 程序,在另一台机器的 cpp 中有 UDP。我能够通过运行 cpp 代码作为客户端和 matlab 代码作为服务器来将数据从 cpp 代码发送到 matlab。当我尝试以客户端运行 matlab 作为服务器并将 cpp 作为服务器运行时,我无法将数据发送到 cpp。在上述两种情况下,程序都在两台不同的机器上运行。我在同一台机器上尝试了 matlab 作为客户端和 cpp 作为服务器,然后它就可以工作了。

我的CPP代码

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include "port.h"
#define BUFSIZE 2048
int
main(int argc, char **argv)
{
    struct sockaddr_in myaddr;  /* our address */
    struct sockaddr_in remaddr; /* remote address */
    socklen_t addrlen = sizeof(remaddr);        /* length of addresses */
    int recvlen;            /* # bytes received */
    int fd;             /* our socket */
    unsigned char buf[BUFSIZE]; /* receive buffer */

    /* create a UDP socket */
    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("cannot create socketn");
        return 0;
    }
    /* bind the socket to any valid IP address and a specific port */
    memset((char *)&myaddr, 0, sizeof(myaddr));
    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    myaddr.sin_port = htons(SERVICE_PORT);
    if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
        perror("bind failed");
        return 0;
    }
    /* now loop, receiving data and printing what we received */
    for (;;) {
        printf("waiting on port %dn", SERVICE_PORT);
        recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen);
        printf("received %d bytesn", recvlen);
        if (recvlen > 0) {
            buf[recvlen] = 0;
            printf("received message: "%s"n", buf);
        }
    }
    /* never exits */
}

在此处发布评论中的答案以提高可见性:

由于程序在同一台计算机上运行时可以工作,

但在单独的计算机上运行时则不能工作,因此这表明存在防火墙问题(意味着计算机正在阻止入站流量)。在 Linux 中,iptables(这就是防火墙的名称)可以根据以下说明暂时禁用: https://www.cyberciti.biz/faq/turn-on-turn-off-firewall-in-linux/

如果这解决了问题,请不要忘记重新打开iptables。然后只需在iptables中为您的程序添加一个类似于以下指令的异常:https://help.ubuntu.com/community/IptablesHowTo#Allowing_Incoming_Traffic_on_Specific_Ports