linuxsocket端口
❶ 浅谈linux下Socket选项设置
TCP/IP协议栈是Linux内核的基石,而Socket层作为TCP/IP层与应用层之间的桥梁,提供了诸如socket/bind/accept/connect等抽象接口,大大简化了网络编程。Socket选项为满足用户定制需求而生,涵盖了地址复用、端口复用、读写超时时间、缓冲区大小等。在Linux中,Socket选项分布在TCP层、IP层与Socket层等,设置时需指定level。通过图示可以直观了解Socket层及各层支持的选项。常用操作Socket选项的API包括getsockopt、setsockopt、fcntl和ioctl。函数调用时需遵循特定的参数格式,明确level、optname、optval类型与长度。optval与optlen作为参数,与操作的选项直接关联,其中optval使用void*类型,optlen使用socklen_t*类型。socklen_t类型与int长度一致,避免了size_t在64位结构中的长度不一致问题。在读写选项时,optval与optlen的编写需根据实际情况决定。SO_REUSEADDR选项用于解决重启时绑定失败的问题,允许同一地址和端口在TIME_WAIT状态时被复用。SO_REUSEPORT选项在Linux3.9版本引入,允许多个进程监听同一IP和端口,增加了对进程所属用户的限制,实现简单的负载均衡。TCP_NODELAY选项用于解决网络拥塞问题,允许发送小包且不强制等待,适用于时效性高的应用。这些选项的设置方法和使用场景,为网络编程提供了丰富的灵活性与优化手段。
❷ linux下创建socket时如何实现指定网口
原理上只有 raw_socket 应该设置网口,正常的 socket 会根据路由来选择出口。
如果需要指定网口,需要设置 SO_BINDTODEVICE,步骤如下:
填写结构体 struct ifreq ifr 的 ifr.ifr_name 为指定的网口,如 "eth1"
setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr))
另外,如果只是需要进行测试,不防直接构包,用 libpcap 等库来进行发送。而不要用系统的 socket 库来发送。