1.关于组播的
问题描述:加入组播组使用struct ip_mreqn,通过ip和网卡index 加入,离开组播组的时候使用struct ip_mreq ,只通过ip 离开,当网卡ip先清除,再离开组播组的话,无法通过ip找到对应的网卡,离开失败。
查看内核ip_mc_find_dev 发现,查找网卡的顺序是先index,然后ip,最后目的ip路由对应的出接口,因此用网卡index应该是可以的,但是修改了离开组播组的数据结构struct ip_mreq 为struct ip_mreqn 之后还是不行,这样不合理啊!!!只能把代码拿出来单独测试,用strace 跟踪发现原来是setsockopt的最后一个参数sizeof(struct ip_mreq) 没有改过来,汗!
2.关于tcp的
系统参数tcp_syn_retries,会影响connect超时时间,内核里面syn 重试的时间间隔是3,6,12... 这样的,如果tcp_syn_retries 设置为3,那么内核connect连接超时时间大概是40多秒,如果应用层程序设置的connect 超时时间超过内核的重连次数所对应的超时时间,那么内核会提前返回结果,在应用层程序看来就是超时时间不准确.这个可以通过调整系统参数tcp_syn_retries 来修改
3.关于udp的
(1)如果是没有connect的udp,sendto 之后系统会给socket分配一个端口号,通过getsockname 可以获取到这个系统分配的端口后,netstat -naup 也可以看到这个进程监听在这个端口号上
(2) 对于udp的端口的监听检查,只能区分网络正常的情况,服务器是否监听该端口,对于ip不存在,或者网络不通的情况无法区分。nc 工具存在同样的问题,当ip不存在的时候,nc -zvu 192.168.5.10 80,会显示成功的
阅读(2279) | 评论(0) | 转发(0) |