【问题标题】:source port number in the recvfrom socket functionrecvfrom 套接字函数中的源端口号
【发布时间】:2021-11-05 09:18:47
【问题描述】:

我想知道src_addr.sin_port 在接收套接字数据时在recvfrom 函数的最后一个参数中填充的基础是什么,其语法是

#include <sys/types.h>
#include <sys/socket.h>

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

还有它的意义是什么,它对接收者有什么帮助吗?

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    成功调用recvfrom 后填充的IP 和端口是接收数据报的源IP 和端口。这可以记录下来,以便用户知道数据报的来源。

    另外,如果需要将数据报发送回此端点,可以将src_addr 传递给sendto 以指定目标IP 和端口。

    【讨论】:

    • 但是我认为我们无法在使用sendto函数发送数据时指定端口号,其中的synatx是ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);。这是否意味着它被发送者操作系统填充?
    • @Harry 目标端口号将包含在dest_addr-&gt;sin_port 中。
    • 正确,那么当使用recvfrom函数接收数据时,发送者的端口号是如何被填满的呢?另外,另一个端点将在同一个端口上监听的保证是什么?
    • @Harry 在来自recvfrom 的调用之后,sin_port 字段包含远程端的端口号。然后可以使用该端口号(连同 IP)将响应发送回该 IP 和端口。此外,UDP 套接字不会像 TCP 套接字那样“监听”。另一端的套接字将能够调用recvfrom 来获得响应。
    • @Harry UDP 套接字可以调用bind 绑定到特定端口。如果不这样做,操作系统将在第一次发送或接收后选择一个端口号。
    猜你喜欢
    • 2011-02-11
    • 2018-05-12
    • 2022-11-24
    • 1970-01-01
    • 2015-10-25
    • 2019-02-04
    • 2016-06-20
    • 2021-11-16
    • 2012-06-12
    相关资源
    最近更新 更多