잘못된 요구?
글쓴이: lkjt / 작성시간: 금, 2004/05/14 - 11:37오후
소켓 프로그램
#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안되는군요.
뭐가 잘못된거죠?
Forums:


Re: 잘못된 요구?
RFC 문서를 다시한번 차근차근 살펴보세요.
일단 헤더와 콘텐츠 구분은'\n\r'이 아니라, '\r\n'을 두개 씁니다.
그리고 HTTP/1.1 리퀘스트에는 기본적으로 보내줘야 할 헤더가 몇가지 존재합니다. (RFC 문서 참고) 그런 헤더가 없이 헤더를 종료했으니 당연히 400 Bad Request 입니다.
HTTP/1.0은 추가 헤더 없이도 사용할 수 있으니 간단한 프로그램이라면 그쪽을 사용하시는 것도 괜찮습니다.
rfc를 보고 필요한것을 다 집어넣어봣는데요.Host
rfc를 보고 필요한것을 다 집어넣어봣는데요.
Host, User-Agent
그리고, \n\r은 저도 순서가 헷갈려서 익스플로러를 캡쳐 해보앗더니 \n\r로 보내길레 그렇게 햇는데. \r\n 이군요.
익스플로러가 보내는것 그대로 캡쳐해서 똑같이 보내도 안되는군요..
감사합니다.순서가 틀렷군요.
감사합니다.
순서가 틀렷군요.
댓글 달기