잘못된 요구?
글쓴이: 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 이군요.
익스플로러가 보내는것 그대로 캡쳐해서 똑같이 보내도 안되는군요..
감사합니다.순서가 틀렷군요.
감사합니다.
순서가 틀렷군요.
댓글 달기