我正在尝试创建一个原始套接字,它在 linux 下发送和接收带有 ip/tcp header 的消息。 我可以成功绑定(bind)到端口并接收 tcp 消息(即:syn) 但是,该消息似乎由操作系统处理,而不是我的。我只是它的读者(比如 wireshark)。 我的原始套接字绑定(bind)到端口 8888,然后我尝试远程登录到该端口。 在wireshark中,它显示端口8888在收到“syn”请求时回复“rst ack”。在我的程序中,它显示它收到一条新消息并且没有回复任何消息。
有什么方法可以实际绑定(bind)到那个端口?(防止 os 处理它)
这是我的部分代码,我尽量去掉那些错误检查以便于阅读
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
int tmp = 1;
const int *val = &tmp;
setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, val, sizeof (tmp));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8888);
bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
//call recv in loop
最佳答案
当您的内核从远程主机接收到 SYN/ACK 时,它没有发现它已将 SYN 发送到该 IP:PORT 组合(从您的原始套接字发送)的记录,这就是为什么它假定已经有错误并向远程主机发送 RST。这个问题可以通过设置一个阻止该端口上所有 TCP 流量的 IP 过滤器来解决(查看 iptables 联机帮助页)。这样您就不必在内核空间中编程,也不会对现有的内核 TCP 模块产生任何影响。
关于linux原始套接字编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606004/