gpt4 book ai didi

Perl 套接字作为(伪)http 服务器与 ftp 请求中断!

转载 作者:可可西里 更新时间:2023-11-01 02:45:44 25 4
gpt4 key购买 nike

以下代码是一个(伪!)http 服务器。它只是发回 http 请求。
来自浏览器的 ftp 请求会发生意外的行为,例如 ftp://localhost:8888/。有了这个,浏览器连接并永远保持连接。

我不明白发生了什么!
如何控制此行为并忽略 ftp 请求?

#!/usr/bin/perl
use strict;
use Socket;
use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
use IO::Poll;

local *S;
socket (S, PF_INET , SOCK_STREAM , getprotobyname('tcp')) || die "socket: $!\n";
setsockopt (S, SOL_SOCKET, SO_REUSEADDR, 1) || die "setsockopt: $!\n";
bind (S, sockaddr_in(8888, INADDR_ANY)) || die "bind: $!\n";
listen (S, 10) || die "listen: $!\n";
fcntl(S, F_SETFL, fcntl(S, F_GETFL, 0) | O_NONBLOCK) || die "fcntl: $!\n";

my $poll=IO::Poll->new;
$poll->mask(*S => POLLIN|POLLOUT);


while( 1 ) {
$poll->poll();
for my $reader ( $poll->handles(POLLIN ) ) {
my $remote = accept (my $connection, $reader);
my $bytes= sysread $connection,my $header,1024;

if (defined $bytes) {
if ($bytes == 0 || (index $header,"\r\n\r\n") < 0) {
close $remote;
next;
}
} else {
close $connection;
next;
}

syswrite $connection,"HTTP/1.1 200 OK\r\n\r\n".$header;
close $connection;
}
}

最佳答案

与 HTTP 不同,FTP 从服务器向客户端发送问候语开始。在这种情况下,客户端认为它正在与 FTP 服务器对话,等待 FTP hello,而服务器认为它正在与 HTTP 客户端对话,等待它发送 HTTP 命令。

解决方案是在尝试 sysread 之前为客户端套接字 ($connection) 设置超时。

关于Perl 套接字作为(伪)http 服务器与 ftp 请求中断!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6417390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com