udp中recvfrom获取发送方的地址IPport

Posted 毛毛虫的爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了udp中recvfrom获取发送方的地址IPport相关的知识,希望对你有一定的参考价值。

struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。

一、sockaddr

sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下:

二、sockaddr_in

sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中,如下: 
 
sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO)。

三、总结

二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。

        sockaddr_in from;int  len;
		len = sizeof(struct sockaddr);
        RecvNum=recvfrom(sock,RecvBuf,1500,0,(sockaddr*)&from,&len);       
      
		printf("IP:%s\\n", (char *)inet_ntoa(from.sin_addr));
		printf("Port:%d\\n", htons(from.sin_port)); 

 

以上是关于udp中recvfrom获取发送方的地址IPport的主要内容,如果未能解决你的问题,请参考以下文章

【奇】udp的recvfrom

recvfrom() 即使是第一次调用中的 UDP 消息,也不会填充来自 IP 地址

获取接收到的UDP数据包的目的地址

udp的recvfrom函数,能接收指定ip和端口发送来的数据吗?

recvfrom()的一次调用只能返回一个UDP包。此种说法正确吗?

实现UDP高效接收/响应