Winsock:获取UDP数据发送端的IP地址和端口号

来源:互联网 发布:淘宝退款诈骗 编辑:程序博客网 时间:2024/06/08 20:03

UDP的接收端使用函数 recvfrom接收数据,这个函数在winsock.h中定义如下:

[cpp] view plaincopyprint?
  1. int recvfrom(
  2. __in SOCKET s,
  3. __out char* buf,
  4. __in int len,
  5. __in int flags,
  6. __out struct sockaddr* from,
  7. __inout_opt int* fromlen
  8. );

其中的参数 from 就保存了数据发送端的IP地址和端口号,为了便于说明,sockaddr_in结构在winsock中定义如下:

[cpp] view plaincopyprint?
  1. struct sockaddr_in {
  2. short sin_family;
  3. u_short sin_port;
  4. struct in_addr sin_addr;
  5. char sin_zero[8];
  6. };

sin_addr:数据发送端的IP地址;

sin_port:数据发送端的端口号;

所以,可以使用如下的代码获取数据发送端的IP地址和端口号:

[cpp] view plaincopyprint?
  1. ......
  2. CHAR szClientIP[128], szClientPort[64];
  3. strcpy(szClientIP, inet_ntoa(from.sin_addr));
  4. strcpy(szClientPort, itoa(ntohs(from.sin_port)));
  5. ......

函数inet_ntoa的作用是将一个IPv4的网络地址转换成为一个标准的IP地址字符串,并且以点号(.)分割,在winsock.h中定义如下:

[cpp] view plaincopyprint?
  1. char* FAR inet_ntoa(
  2. __in struct in_addr in
  3. );

函数ntos的作用是将一个16的无符号数有网络字节顺序转换成主机字节顺序,在winsock.h中定义如下:

[cpp] view plaincopyprint?
  1. u_short ntohs(
  2. __in u_short netshort
  3. );

原创粉丝点击