CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

udp通信

楼主haibozhang(老婆要吃土豆,可是我没钱了,怎么办!)2004-12-03 08:54:47 在 C/C++ / C++ 语言 提问

我做的一个udp通信程序,在机子只有一个网卡一个ip地址的情况下一切正常,可是当出现多ip的时候有时候会不正常,因为我必须将本机ip地址(和对方建立通信的那个ip告知对方),可是现在有多个,我就不知道应该到底发那个了,!     我如下操作  
  if   (getsockname(guiSockfd,   (struct   sockaddr   *)&host_addr,   &socklen)   ==   0)  
  {  
            UINT16   gusIPPort   =   ntohs(host_addr.sin_port)   ;  
            //host_addr.sin_addr.s_addr;   (如此去IP始终为空)  
            gusLocalPort   =   gusIPPort;    
          .....  
  }  
   
  我只能得到本机和对方的端口,ip地址却始终为空!   怎么办呢?我求大家了!  
  注意:   是UDP,不是TCP! 问题点数:0、回复次数:8Top

1 楼boxban(冻酸梨)回复于 2004-12-03 09:02:15 得分 0

先调用bind绑定指定的IPTop

2 楼darkstar21cn(≮天残≯无畏)(死亡进行时)回复于 2004-12-03 09:21:55 得分 0

int   recvfrom(  
      SOCKET   s,  
      char*   buf,  
      int   len,  
      int   flags,  
      struct   sockaddr*   from,  
      int*   fromlen  
  );  
  ////windows  
  from    
  [out]   Optional   pointer   to   a   buffer   in   a   SOCKADDR   structure   that   will   hold   the   source   address   upon   return.    
  ////linux  
                If   from   is   not   NULL,   and   the   underlying   protocol     provides     the     source  
                address,     this     source   address   is   filled   in.     The   argument   fromlen   is   a  
                value-result   parameter,   initialized   to   the   size   of   the     buffer     associ-  
                ated     with     from,   and   modified   on   return   to   indicate   the   actual   size   of  
                the   address   stored   there.  
   
  接受方使用这个方法接受数据,就可以从from里得到发送方的ip及端口了。一般情况下,发送使用哪个ip和端口是由操作系统控制的(发送端口可以指定,但是没有试过指定发送ip的),在没有连接以前是不可知的。  
  不知道楼主为什么需要这个需求。希望这个能帮得上你。Top

3 楼haibozhang(老婆要吃土豆,可是我没钱了,怎么办!)回复于 2004-12-03 09:26:24 得分 0

谢谢    
    我们的实现是这样的:   比如登陆系统的时候我们连接服务器,连接完以后发送登陆用户的命令请求给工作站,工作站收到命令后判断,然后将此用户的ID和此IP帮定,以便工作站给我们回消息的时候根据用户的ID就能回复到相应的机子上,不至于发到别的机子上面!   在用户退出时,需要注销此用户.  
      所以我们现在在登陆的时候就给服务器发送了一个本机的IP地址,可是出现多IP的时候就挂了(呵呵),也许时我们当初的实现有问题,可是现在只能这样了,不知道有没有方法做到我上面的要求呢!Top

4 楼boxban(冻酸梨)回复于 2004-12-03 09:53:35 得分 0

你的描述有点混乱:(  
  一会服务器,一会工作站,一会我们,都谁跟谁呀  
   
  如果工作站就是服务器,那根本就不用告诉它客户端的IP:用recvfrom自然可以取到。除非是特别应用环境,否则客户端没有必要把自己的IP显式地告诉服务器。  
  Top

5 楼yeehya(老汉了)回复于 2004-12-03 10:08:51 得分 0

到底是"服务器"有多ip还是"客户端"有多ip啊?  
  服务器端多ip还真的不好说.看网络编程书上提到用dns查找主机名,验证服务器的名字,而不是ip地址,没做过...  
  客户端直接指定需要的ip,甚至发送所有的ip.Top

6 楼haibozhang(老婆要吃土豆,可是我没钱了,怎么办!)回复于 2004-12-03 11:35:15 得分 0

客户端是多IP,我现在必须给服务器发本机IP,   不错!   用recvfrom自然可以取到。,但是那样的话,我们发到工作站的时候,每一包数据到要检查,会很慢!Top

7 楼boxban(冻酸梨)回复于 2004-12-07 19:12:59 得分 0

如果是Windows系统,推荐你用下面几个API来发现最佳IP:  
  GetBestRoute,   GetAdaptersInfo,   GetBestInterfaceTop

8 楼ljhnew(Lemon Tree)回复于 2004-12-07 21:10:39 得分 0

先用bind到INADDR_ANY地址上,因为你采用UDP,在服务器上采用被动“连接”,用recvfrom可以得到客户机的IP和port,在客户端采用主动“连接”,可以指定连接的IP,至于报文发送时所采用的IP地址由操作系统的“路由”来决定。你可以用route来查看你的系统的路由信息。Top

相关问题

  • TCP与UDP通信问题!
  • 有关UDP通信的一个问题
  • 求一个UDP通信的例子。
  • TCP与UDP通信问题!(RH9)
  • 最简单的UDP通信失败!?
  • 基于UDP的socket通信问题
  • 高分求UDP通信的vxworks代码
  • 求助,怎么将tcp传输通信改成udp通信!!!!
  • 如何用 CAsyncSocket UDP 异步方式实现一对多通信?
  • 如何用socket api写UDP协议通信的程序。。。

关键词

  • ip
  • 服务器
  • 通信
  • 客户
  • 端口
  • 连接
  • 用户
  • 系统
  • source
  • 工作站

得分解答快速导航

  • 帖主:haibozhang

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo