免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2035 | 回复: 6
打印 上一主题 下一主题

再问UDP(蓝色键盘一定要进来) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-04-17 17:11 |只看该作者 |倒序浏览
蓝色键盘,记得上次你跟我说过,在udp中,发送方不一定要bind,但是被动接收方一定要bind,其中的原因你说得非常详细,让我明白了很多,也解决了当时的问题。
    不过,可能是因为我并没有完全理解udp模式,我在想:那这么一来,不是只能一方发送另一方接收了么?如果我想接收方收到信息后返回给发送方一个应答,该怎么做呢?
    我查了一些书,可是例子都是接收了完事。手头倒是有一本网络编程卷1,只不过是英文的,看着有些费劲。你能不能再解答一下呢?
    也请其他高手帮我解惑。谢谢!

论坛徽章:
0
2 [报告]
发表于 2003-04-17 17:30 |只看该作者

再问UDP(蓝色键盘一定要进来)

这个问题呢,我可以明确告诉你,双方是可以互发的!
oicq第一次连接是tcp/ip连接,往下的就是udp连接,不然的话腾讯服务器哪受得了?
没猜错的话传送文件应该也是基于udp的,因为每次传递的字节是有限的,所以双方要有握手过程,只有确认已收到上一个包,才继续发下一个包,可见双方互发是肯定的!
不好意思,要下班了,如果你还需要帮助的话,明天我们再讨论

论坛徽章:
0
3 [报告]
发表于 2003-04-17 17:38 |只看该作者

再问UDP(蓝色键盘一定要进来)

我琢磨着一定可以互发的,只是还没有看见这样的例子,所以有些疑问。等你明天上班,再告诉我吧。今晚,我再仔细看看,争取找到问题的关键点。我也要下班了:)明天见

论坛徽章:
0
4 [报告]
发表于 2003-04-17 18:05 |只看该作者

再问UDP(蓝色键盘一定要进来)

我记得在udp中都应bind吧,因为套接是根据ip 号和端口号唯一确定一条连接的。最起码双方都bind的情况下,接收的时候都能获得对方的IP和端口,这样就能双方通信了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-04-17 18:06 |只看该作者

再问UDP(蓝色键盘一定要进来)

原帖由 "一颗流星" 发表:
蓝色键盘,记得上次你跟我说过,在udp中,发送方不一定要bind,但是被动接收方一定要bind,其中的原因你说得非常详细,让我明白了很多,也解决了当时的问题。
    不过,可能是因为我并没有完全理解udp模式,我在想..........





呵呵,其实关键是理解sendto和recvfrom最后两个参数的含义。为了理解方便,sendto最后两个参数类似于connect的最后两个参数,recvfrom的最后两个参数类似于accept的最后两个参数。
下面是recvfrom的原型:
ssize_t recvfrom(
              int              s,
              void            *buf,
              size_t           len,
              int              flags,
              struct sockaddr *from,
              socklen_t       *fromlen
);

当recvfrom调用成功,例如你的服务器调用该函数,那么结构struct sockaddr *from将由客户的IP和端口号来装填,这个动作由协议实现的。既然对方的IP和PORT已经存在于结构from中了,那么使用sendto的时候,做后两个参数直接引用该指针就可以了。

例如下面的一段代码,recvfrom收到数据后,返回信息给发送者。


  1. 。。。。
  2. struct sockaddr_in serv,client;
  3. 。。。。/*局部变量定义*/
  4. sockfd=socket(AF_INET,SOCK_DGRAM,0);
  5. 。。。。/*填充serv结构,bind等*/
  6. /*接受数据*/
  7. recvlen = recvfrom(sockfd,(char *)&recvbuf,len,0,(struct sockaddr *)&client,&clientlen );
  8. 。。。。/*接受数据处理*/
  9. /*返回给对方*/
  10. sendlen=sendto(sockfd,(char *)&sendbuf,len,0,(struct sockaddr *)&client,sizeof(client));
  11. /*其他处理*/

复制代码

论坛徽章:
0
6 [报告]
发表于 2003-04-18 08:26 |只看该作者

再问UDP(蓝色键盘一定要进来)

yeah,right!

论坛徽章:
0
7 [报告]
发表于 2003-04-18 09:33 |只看该作者

再问UDP(蓝色键盘一定要进来)

这下彻底明白了:0
谢谢~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP