잘못된 요구?

lkjt의 이미지

소켓 프로그램

#include <stdio.h>
#include "winsock2.h"

void main() {

    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return;
    }

    // Connect to a server.
    sockaddr_in clientService;

    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "211.32.117.21" );
    clientService.sin_port = htons( 80 );

    if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return;
    }

    // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "GET / HTTP/1.1\n\r\n\r";
    char recvbuf[32] = "";

    bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );

    while( bytesRecv == SOCKET_ERROR ) {
        bytesRecv = recv( m_socket, recvbuf, 32, 0 );
        if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
            printf( "Connection Closed.\n");
            break;
        }
        if (bytesRecv < 0)
            return;
        printf( "Bytes Recv: %ld\n", bytesRecv );
    }

    return;
}

이렇게 소스를 짯습니다.

응답이

Bad request 400

이 나오는데요 /.

혹시나 해서 rfc를 보고 Host도 붙여보고 익스플로러가 보내는것을 캡쳐하여
그대로 보냈는데요. 소스코드가 recv안되는군요.

뭐가 잘못된거죠?

progcom의 이미지

lkjt wrote:

    char sendbuf[32] = "GET / HTTP/1.1\n\r\n\r";

RFC 문서를 다시한번 차근차근 살펴보세요.

일단 헤더와 콘텐츠 구분은'\n\r'이 아니라, '\r\n'을 두개 씁니다.
그리고 HTTP/1.1 리퀘스트에는 기본적으로 보내줘야 할 헤더가 몇가지 존재합니다. (RFC 문서 참고) 그런 헤더가 없이 헤더를 종료했으니 당연히 400 Bad Request 입니다.

HTTP/1.0은 추가 헤더 없이도 사용할 수 있으니 간단한 프로그램이라면 그쪽을 사용하시는 것도 괜찮습니다.

lkjt의 이미지

rfc를 보고 필요한것을 다 집어넣어봣는데요.

Host, User-Agent

그리고, \n\r은 저도 순서가 헷갈려서 익스플로러를 캡쳐 해보앗더니 \n\r로 보내길레 그렇게 햇는데. \r\n 이군요.

익스플로러가 보내는것 그대로 캡쳐해서 똑같이 보내도 안되는군요..

lkjt의 이미지

감사합니다.

순서가 틀렷군요.