UDP的接收端使用函数 recvfrom接收数据,这个函数在winsock.h中定义如下:
int recvfrom(
__in SOCKET s,
__out char* buf,
__in int len,
__in int flags,
__out struct sockaddr* from,
__inout_opt int* fromlen
);
其中的参数 from 就保存了数据发送端的IP地址和端口号,为了便于说明,sockaddr_in结构在winsock中定义如下:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin_addr:数据发送端的IP地址;
sin_port:数据发送端的端口号;
所以,可以使用如下的代码获取数据发送端的IP地址和端口号:
......
CHAR szClientIP[128], szClientPort[64];
strcpy(szClientIP, inet_ntoa(from.sin_addr));
strcpy(szClientPort, itoa(ntohs(from.sin_port)));
......
函数inet_ntoa的作用是将一个IPv4的网络地址转换成为一个标准的IP地址字符串,并且以点号(.)分割,在winsock.h中定义如下:
char* FAR inet_ntoa(
__in struct in_addr in
);
函数ntos的作用是将一个16的无符号数有网络字节顺序转换成主机字节顺序,在winsock.h中定义如下:
u_short ntohs(
__in u_short netshort
);