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
- );
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];
- };
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)));
- ......
......
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
- );
char* FAR inet_ntoa(
__in struct in_addr in
);
函数ntos的作用是将一个16的无符号数有网络字节顺序转换成主机字节顺序,在winsock.h中定义如下:
- u_short ntohs(
- __in u_short netshort
- );