linux原始套接字编程问题

标签 linux sockets

我正在尝试创建一个原始套接字,它在 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/

相关文章:

linux - 如何防止 MATLAB 打印空格和使用错误的字体?

linux - 带有 -i 选项的 sed 命令在 Mac 上失败,但在 Linux 上有效

linux - 羊群锁定顺序?

linux - 计算输入文件中字符串的出现次数

linux - 创建 docker 基础镜像

Python 套接字接收 - 由于收到的消息长度极长而卡在 While 循环中

linux - 如何异步检查 ipv6 网络接口(interface)是否在 linux 中将状态从 tentative 更改为 "valid"?

c - 内存中的套接字文件描述符是什么形式?

python - 在 python 中解析来自 WIZ110SR 的 TCP/IP 串行数据

c# - 长度= 'serverStream.Length'引发了 'System.NotSupportedException'类型的异常