【问题标题】:do udp source port and destination port have to match?udp源端口和目标端口必须匹配吗?
【发布时间】:2016-08-19 03:45:08
【问题描述】:

我正在尝试使用 c/c++ 学习套接字编程。我写了两个小的 udp 发件人。一个是带有 bind()ing 的,另一个是没有 bind()ing 的。我在远程 IP 上构建了这两个程序。同时,我在本地系统上构建了一个小型 udp 接收器。我试图将 udp 消息从两个发送程序程序发送到我的本地接收器。但是接收者只能通过 bind()ing 接收来自发送者的消息。它必须与目的地绑定在同一个端口号上。否则,即使使用 bind()ing,它仍然不起作用。 但是当我将没有绑定()的发件人程序移动到我的本地系统并将消息发送到“127.0.0.1”时它工作了。

所以对我来说,似乎在本地发送 udp 数据包,src 端口和 dest 端口可以是不同的数字。但是当从不同的 IP 地址发送 udp 数据包时,发送和接收端口必须具有匹配的端口号。对吗?

这是我的 udp 发送程序:

#include <iostream>
#include <cstring>
#include <cerrno>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

using namespace std;

int main(int argc, char *argv[]){
    if(argc!=2){
        cout<<"need arg"<<endl;
        return 1;
    }
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in des;
    des.sin_family = AF_INET;
    des.sin_port = 9999;
    des.sin_addr.s_addr = inet_addr("my ip address"); //I used "127.0.0.1" when I tried it locally.

    /* this is all the difference between the sender with and without bind()
    struct sockaddr_in sai;
    sai.sin_family = AF_INET;
    sai.sin_port = 5001;
    sai.sin_addr.s_addr = INADDR_ANY;
    if(bind(sfd, (struct sockaddr *)&sai, sizeof sai)==-1){
        cout<<"bind:"<<strerror(errno)<<endl;
        _exit(1);
    }
    cout<<"binded successfully"<<endl;
    */

    int byt = sendto(sfd, argv[1], strlen(argv[1])+1, 0, (struct sockaddr *)&des, sizeof des);
    cout<<byt<<endl;
    if(byt<0){
        cout<<"sendto"<<strerror(errno)<<endl;
    }

    return 0;
}

【问题讨论】:

  • 不,我认为您对一些关键点感到困惑。这是一个很好的教程,可能会有所帮助:Programming with UDP sockets。这个链接进一步讨论了bind的作用:stackoverflow.com/questions/3057029/…
  • 每个 UDP(和 TCP)端点都有一个(地址、端口)对。这很好地对应于(机器,程序)。端口只是一个端点的特性,而不是整个通信通道的特性,因此不需要在两端使用相同的端口。通常情况下,它不是。

标签: c++ c sockets networking udp


【解决方案1】:

所以对我来说,似乎在本地发送 udp 数据包,src 端口和 dest 端口可以是不同的数字。

正确。

但是当从不同的 IP 地址发送 udp 数据包时,发送和接收端口必须有匹配的端口号。对吗?

没有。它没有。回复时需要确保使用接收到的数据报的源端口,通过recvfrom()返回,作为sendto()中回复数据报的目标端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 2014-02-10
    • 2015-09-29
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多