Socket(1)

公司C语言小组开展的IM软件开发已经是第三周了,而我现在还只停留在只能发包不能收包的阶段,觉得自己真的挺不努力的。

上星期试着发包的时候,配合wireshark抓包,真正理解了UDP是怎样无连接的,做的UDP发包程序只负责把包发出去,而不会去理会这个包对方是否收到。体现在抓包工具里就是能抓到我发的包,但是下个包就是红色的IGMP警告:端口不可达。(因为服务器没开)

今天我又仔细考虑了一下我的程序,为什么我不能收包呢?原来有个问题一直没想清楚:因为我一直看的代码都是单独的客户端和服务器端,分别只能实现发和收,没有一个完整的能发能收的程序。我还一直在想,我建了一个socket,然后建了一个addr是服务器的IP和端口,然后sendto了,那么服务器给我回了消息会往哪个端口发呢?这个端口我该怎么bind再recvfrom啊?问了同事才知道,bind是服务器才需要的,recvfrom的端口号是已创建的socket已知的(见后文)。

也就是说,client在port1上向server发包了,server回复的消息会发往这个port1.

看来我看书还是不仔细,bind和recvfrom的用法没真正弄懂。

看来还是得翻MSDN

其中的_in和_out是很值得注意的,表示了哪些是输入,哪些是输出。

可见,使用recvfrom是不需要给定发送方地址的。

对于server端,socket的本地地址是由bind来显式指定的,而对于client端,这个地址是由sendto来隐式绑定的

recvfrom是阻塞式的,没有收到数据就会一直等下去(今天我还写了第二个socket,bind后再recvfrom,当然收不到数据,就卡着了)

恩,以后要勤翻MSDN!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值