作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在学习 Unix 网络编程第 1 卷,我想在 Linux 中重现 RST 的接受错误。
socket()
、bind()
、listen()
和sleep(10)
LINGER
的 socket()
、connect()
、setsockopt()
、close()
和return
accept()
我认为第 3 步会出现类似 ECONNABORTED
的错误,但不会。
我想知道为什么吗?
如果你能帮助我,我将不胜感激。
服务器代码
如下:
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdio.h>
#include <strings.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in addr;
bzero(&addr, sizeof addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
bind(sock, (struct sockaddr*)(&addr), (socklen_t)(sizeof addr));
listen(sock, 5);
sleep(10);
if (accept(sock, NULL, NULL) < 0)
perror("error");
else
printf("right");
return 0;
}
以下是客户端代码
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdio.h>
#include <strings.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in addr;
bzero(&addr, sizeof addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
connect(sock, (struct sockaddr*)(&addr), (socklen_t)(sizeof addr));
struct linger ling;
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, sizeof ling);
close(sock);
return 0;
}
最佳答案
没有。我想你会得到一个空的但完整的连接(没有数据)。内核将管理完整的连接建立,然后它将立即获得一个 FIN 数据包(意思是 EOF,而不是重置)并将处理它(或等待用户空间进程关闭其一侧,将 FIN 发送到另一侧)对于连接中止,您需要重新启动客户端计算机(或服务器),不允许它发送 FIN 数据包(或在重新启动之前将其与网络断开连接)永远不会回答 ACK,因此您不会收到从 ACK 发送的 RST。
RST 数据包在双方之间存在某种状态不匹配时由内核自动发送。为了在正确的实现中发生这种情况,您必须强制这种状态不匹配(这就是为什么需要重启机器)
获取 RST 段的其他方法涉及错误的 TCP 实现,或破坏传输中的数据包(更改传输中的发送方或接收方序列号)
RST 数据包的目的不是为 TCP 添加功能,而是检测不当行为,因为不应该通过正确使用套接字来获得重置。 Listen 系统调用允许您在内核空间中保留资源,以允许用户空间进程在客户端尝试连接时准备处理连接。如果您按照您的意愿进行操作,您将获得没有数据但有效的连接,SO_LINGER
会在机器没有时间向每个机器发送数据包时强制丢失状态其他...但是正在连接,整个连接都在内核中处理,并且不会中止。
关于c - 如何在 Linux 中重现接受错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53276541/
我是一名优秀的程序员,十分优秀!