Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP套接字中的人工延迟,用于竞争条件攻击_C_Sockets - Fatal编程技术网

TCP套接字中的人工延迟,用于竞争条件攻击

TCP套接字中的人工延迟,用于竞争条件攻击,c,sockets,C,Sockets,我试图在用C实现的TCP套接字服务器中引入一个人工延迟 其想法是,客户机需要一段时间才能连接到服务器 为了实现这一点,我尝试不简单地使用阻塞接受来接收连接,轮询等待的连接,然后在接受之前睡觉 然而,数据似乎无论如何都被写入了其他缓冲区,唯一的效果是我的程序需要睡眠延迟才能从缓冲区读取数据。同时,客户端已经愉快地连接并发送了数据 我这样做对吗?可能相关信息:客户端和服务器都通过同一虚拟机VMWare Player上的环回接口进行连接 我的客户代码: printf("Connecting to %s

我试图在用C实现的TCP套接字服务器中引入一个人工延迟

其想法是,客户机需要一段时间才能连接到服务器

为了实现这一点,我尝试不简单地使用阻塞接受来接收连接,轮询等待的连接,然后在接受之前睡觉

然而,数据似乎无论如何都被写入了其他缓冲区,唯一的效果是我的程序需要睡眠延迟才能从缓冲区读取数据。同时,客户端已经愉快地连接并发送了数据

我这样做对吗?可能相关信息:客户端和服务器都通过同一虚拟机VMWare Player上的环回接口进行连接

我的客户代码:

printf("Connecting to %s:18211 .. ", host); fflush(stdout);

fd = socket(AF_INET, SOCK_STREAM, 0);

memset(&sin, 0, sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(host);
sin.sin_port = htons(18211);

if(connect(fd, (void *)&sin, sizeof(struct sockaddr_in)) == -1) {
  printf("Unable to connect to host %s\n", host);
  exit(EXIT_FAILURE);
}

#define HITHERE ".oO Oo.\n"
if(write(fd, HITHERE, strlen(HITHERE)) == -1) {
  printf("Unable to write banner to host %s\n", host);
  exit(EXIT_FAILURE);
}
#undef HITHERE

printf("Connected!\nSending file .. "); fflush(stdout);

ffd = open(file, O_RDONLY);
if(ffd == -1) {
  printf("Damn. Unable to open file\n");
  exit(EXIT_FAILURE);
}
服务器代码:


我尝试在此处执行套接字轮询,然后在接受之前休眠,但在接收数据时,客户端没有延迟。

TCP握手SYN,SYN/ACK,ACK发生在操作系统级别,在收到通知之前,客户端可以立即自由发送数据。accept只是一个服务器端的东西,为特定连接提供fd


如果您想延迟建立连接,您可能应该在防火墙中这样做。

TCP握手SYN,SYN/ACK,ACK发生在您收到通知之前,在操作系统级别,客户端可以立即自由发送数据。accept只是一个服务器端的东西,为特定连接提供fd


如果您想延迟建立连接,您可能应该在防火墙中这样做。

我支持防火墙的想法,例如,iptables中的一些ack延迟。另一种尝试可能是将listenbacklog设置为0或非常小的值。然而,IIRC虽然我不确定Linux没有设置它的数字给听,所以你必须实验看看它有多大。在调用accept之前,请先查看有多少客户端连接,然后再添加一个待利用的客户端。

我支持防火墙的想法,例如,iptables中的一些ack延迟。另一种尝试可能是将listenbacklog设置为0或非常小的值。然而,IIRC虽然我不确定Linux没有设置它的数字给听,所以你必须实验看看它有多大。在调用accept之前,请先查看连接了多少个客户端,然后再添加一个待利用的客户端。

我看不到任何服务器代码。复制粘贴错误?@thuovila我将其保存在一个从Live CD启动的暂停虚拟机中,它无法恢复,所以我丢失了它!我看不到任何服务器代码。复制粘贴错误?@thuovila我将其保存在一个从Live CD启动的暂停虚拟机中,它无法恢复,所以我丢失了它!