UDP通信绑定指定IP

8 篇文章 0 订阅

由于测试需要,自己用vconfig在自己的虚拟机里添加了很多ip,实现不同Ip间的通信。UDP客户端向服务器发送报文时,绑定会有最近IP原则,比如,你机器上有如下几个IP:10.1.1.1   ,10.1.1.2 ,  10.1.1.50,  10.1.2.51 , 10.1.2.90  , 10.1.3.91 ,10.0.0.1, 192.168.42.137,现在要向192.168.42.1发送报文,系统会自动给你分配离192.168.42.1最近的ip 192.168.42.137绑定,如果我们要用10.1.1.1这个Ip给任何一个ip发送报文,并接收ack就必须在绑定时绑定10.1.1.1这个ip,源码如下

int net_bind(int sock_fd, const char *bind_addr) {
 struct sockaddr_in host_addr;
 memset(&host_addr, 0, sizeof(host_addr));
 host_addr.sin_family = AF_INET;
 host_addr.sin_port = htons(0);
 // host_addr.sin_addr.s_addr = inet_addr(bind_addr);
// host_addr.sin_addr.s_addr = htonl("10.1.1.1");
 if (inet_pton(AF_INET, bind_addr, &host_addr.sin_addr) <= 0) {
  cout << "Initializing UDP ip err " << endl;
 }
 if (-1 != bind(sock_fd, (struct sockaddr *) &host_addr, sizeof(host_addr)))
  return 0;

 prt_err_msg(s_isDebug, "not implement", 0);
 return -1;
}

 

传入指定IP,并显式调用该函数,由于UDP通信系统会自动分配端口,所以我们可以将端口设为0,系统会自动分配

int net_udp_send(int sock_fd, const char *buff, size_t buff_size,
  const char *dst_addr, int port) {
 int ret_send = 0;
 struct sockaddr_in server_addr;
 memset(&server_addr, 0, sizeof(server_addr));
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(port);
 server_addr.sin_addr.s_addr = inet_addr(dst_addr);
 if (-1 != (ret_send = sendto(sock_fd, buff, buff_size, 0,
   (struct sockaddr *) (&server_addr), sizeof(server_addr))))
  return ret_send;

 prt_err_msg(s_isDebug, "sendto error", errno);
 return -1;
}

int net_udp_recv(int sock_fd, char *buff, size_t buff_size, char *recv_addr,
  size_t *recv_size, int *recv_port) {
 int ret_recv = 0;
 char *addr;
 socklen_t server_addr_size = sizeof(struct sockaddr_in);
 struct sockaddr_in server_addr;
 memset(&server_addr, 0, sizeof(server_addr));

 if (-1 != (ret_recv = recvfrom(sock_fd, buff, buff_size, 0,
   (struct sockaddr *) (&server_addr), &server_addr_size))) {
  addr = inet_ntoa(server_addr.sin_addr);
  memcpy(recv_addr, addr, strlen(addr));
  *recv_port = ntohs(server_addr.sin_port);
  return ret_recv;
 }

 prt_err_msg(s_isDebug, "recvfrom error", errno);
 return -1;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值