현재 위치: > 최신 기사 목록> Socket_accept ()를 사용하여 간단한 파일 전송 서비스 (FTP-Like)를 구축하십시오.

Socket_accept ()를 사용하여 간단한 파일 전송 서비스 (FTP-Like)를 구축하십시오.

M66 2025-05-23

PHP에서 Socket_accept () 는 서버 측 소켓 통신을 구현하는 핵심 기능입니다. 이를 통해 클라이언트가 시작한 연결 요청을 수락하고 추가 전송 및 수신을 수신 할 수 있습니다. 이 기사에서는 기본 PHP의 소켓 확장을 기반으로 간단한 FTP와 같은 파일 전송 서비스를 구축하여 기본 파일 업로드 및 다운로드 기능을 구현하는 방법을 보여줍니다.

1. 준비

먼저 소켓 확장이 PHP에서 활성화되어 있는지 확인하십시오. php.ini에 다음 구성이 있는지 확인하십시오.

 extension=sockets

또한 파일을 읽고 쓸 수있는 디렉토리와 PHP 스크립트를 실행하는 권한을 실행하는 디렉토리도 필요합니다.

2. 서버 코드

서버의 책임에는 포트 듣기, 연결 수락, 구문 분석 명령, 파일 읽기 및 쓰기 작업이 포함됩니다. 기본 구현은 다음과 같습니다.

 <?php

$host = '0.0.0.0';
$port = 2121; // 비슷한FTP맞춤형 포트
$saveDir = __DIR__ . '/uploads';

if (!is_dir($saveDir)) {
    mkdir($saveDir, 0777, true);
}

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);

echo "FTP-like server started on $host:$port\n";

while (true) {
    $client = socket_accept($socket);
    if ($client === false) continue;

    socket_write($client, "220 m66.net FTP Service Ready\r\n");

    $command = trim(socket_read($client, 1024));

    if (preg_match('/^UPLOAD (\S+)$/', $command, $matches)) {
        $filename = basename($matches[1]);
        $filepath = $saveDir . '/' . $filename;

        socket_write($client, "150 Opening binary mode data connection.\r\n");

        $file = fopen($filepath, 'w');
        while ($data = socket_read($client, 2048)) {
            fwrite($file, $data);
            if (feof($file)) break;
        }
        fclose($file);
        socket_write($client, "226 Transfer complete.\r\n");
    }

    elseif (preg_match('/^DOWNLOAD (\S+)$/', $command, $matches)) {
        $filename = basename($matches[1]);
        $filepath = $saveDir . '/' . $filename;

        if (!file_exists($filepath)) {
            socket_write($client, "550 File not found.\r\n");
        } else {
            socket_write($client, "150 Opening binary mode data connection.\r\n");
            $file = fopen($filepath, 'r');
            while (!feof($file)) {
                $buffer = fread($file, 2048);
                socket_write($client, $buffer);
            }
            fclose($file);
            socket_write($client, "226 Transfer complete.\r\n");
        }
    }

    else {
        socket_write($client, "500 Unknown command.\r\n");
    }

    socket_close($client);
}

3. 클라이언트 시뮬레이션

Telnet/NetCat을 사용하여 테스트 할 수 있지만 편의를 위해 간단한 PHP 클라이언트를 작성할 수도 있습니다.

 <?php

$host = 'm66.net';
$port = 2121;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);

$response = socket_read($socket, 1024);
echo $response;

$filename = 'test.txt';
$data = file_get_contents($filename);
$command = "UPLOAD $filename\r\n";

socket_write($socket, $command);
usleep(100000); // 약간 지연되었습니다
socket_write($socket, $data);

$response = socket_read($socket, 1024);
echo $response;

socket_close($socket);

4. 안전 및 개선 제안

  1. 권한 제어 : 실제 배치 중 불법 액세스를 방지하려면 인증 메커니즘이 필요합니다.

  2. 멀티 스레딩/동시성 : pcntl_fork ()를 사용하거나 Swoole을 사용하여 성능을 향상시킵니다.

  3. 파일 확인 : MD5 확인 코드를 통해 파일 무결성을 확인하십시오.

  4. 암호화 된 전송 : TLS/SSL을 통한 보안 통신.

5. 요약

이 기사는 Socket_accept () 와 결합 된 PHP 기본 소켓 프로그래밍 방법을 통해 간단한 FTP와 같은 파일 전송 서비스를 구현하는 방법을 보여줍니다. 이 방법은 소켓 통신의 기본 원리를 학습하는 데 적합하며 경량 변속기 서비스의 프로토 타입으로 사용될 수도 있습니다. 대규모 프로젝트의 경우 FTP/SFTP 서버 또는 WebDAV 서비스와 같은보다 성숙한 솔루션이 권장됩니다.