윈속으로 웹페이지 긁어오는 프로그램을 만들었는데요.

nyamx2의 이미지

작동이 되질 않습니다.

디버깅해보면 recv()에서 블락킹이 걸리네요.

패킷을 보면 분명히 GET은 전달하는데..

telnet server 80 치고 GET 엔터 하면 페이지가 잘 뜨는데

어째서 제가 만든 프로그램에선 안되는걸까요?ㅠ_ㅠ

char* get_html(char *address)
{
WSADATA wsaData;
SOCKET sock;
LPHOSTENT lpHostEntry;
SOCKADDR_IN server_addr;

int datasize;
char server[ADDR_LEN];
char page[ADDR_LEN];
char *data;
int i;
char buf[BUFFER];
int nRet;

// 주소 파싱

for (i = 7 ; i < strlen(address) ; i++)
if (address[i] == '/') break;

strcpy(server, address);
server[i] = '\0';
strcpy(page, &address[i+1]);

printf("서버네임 : %s, 페이지네임 : %s\n", server, page);

WSAStartup(MAKEWORD(2, 2), &wsaData);

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sock == INVALID_SOCKET)
{
printf("socket() error\n)");
exit(0);
}

lpHostEntry = gethostbyname(server);

if (lpHostEntry == NULL)
{
printf("함수 gethostbyname() 호출 하는 중에 문제가 발생했습니다.");
exit(0);
}

memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr = *( (LPIN_ADDR) *lpHostEntry->h_addr_list);
server_addr.sin_port = htons(80);

nRet = connect(sock, (LPSOCKADDR)&server_addr, sizeof(server_addr) );
if (nRet == SOCKET_ERROR)
{
printf("connect() 함수를 호출하는데 문제가 발생했습니다.");
exit(0);
}

sprintf(buf, "GET %s", page);

send(sock, buf, strlen(buf), 0);

datasize = recv(sock, buf, BUFFER, 0);

if (datasize == SOCKET_ERROR)
{
printf("recv() 함수를 호출하는데 문제가 발생했습니다.");
exit(0);
}

WSACleanup();

return buf;
}

mandugukbap의 이미지

라인피드와 캐리지 리턴이 포함되어야 하지 않을까요?

chadr의 이미지

sprintf(buf, "GET %s \r\n", page);

이렇게 고쳐보세요.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.