[질문]소켓플밍으로 간단한 http client 만들어봤는데요

gostop의 이미지

요즘 소켓 프로그래밍을 배우는 중이여서 아주 간단한 세이클럽에 로그인하는 웹클라이언트를 만들어봤습니다.

int main()
{
int sock;
FILE *fp;
struct sockaddr_in addr;
struct hostent *host;
char *hostname="www.sayclub.com";
char *port="80";
char buf[10000];

char header1[]=
        "POST /global/login.nwz HTTP/1.1\r\n"
        "Accept: */*\r\n"
        "Content-Type: application/x-www-form-urlencoded\r\n"
        "User-Agent: Sayclub\r\n"
        "Host: www.sayclub.com\r\n"
        "Connection: Keep-Alive\r\n"
        "Cache-Control: no-cache\r\n"
        "Cookie: RMID=a3b411574074d3c0; SK_POP=1; KTF_logout=1; mym_logout=4; gmdw_logout=1; poker2_main=YToxOntzOjQ6InZpZXciO2k6MTt9; RDB=c80200000000005553010000001f1f0500040400000001; ConnectionInfo=\r\n\r\n";

char header2[]=
        "userid=xxx&passwd=xxx&pageurl=http://www.sayclub.com/index.nwz&from=&key=xxx16121571&myip=211.233.47.127&myport=42626&admin_index=0\r\n\r\n";

if(!(host=gethostbyname(hostname))) {
        fprintf(stderr, "Unknown Host: %s\n", hostname);
        exit(1);
}

sock=socket(PF_INET, SOCK_STREAM, 0);
if(sock==-1) {
        perror("socket() error!");
        exit(1);
}

memset(&addr, 0, sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr=*(struct in_addr *)host->h_addr;
addr.sin_port=htons(atoi(port));

if(connect(sock, (struct sockaddr *)&addr, sizeof(addr))==-1) {
        perror("connect() error!");
        exit(1);
}

if(write(sock, header1, sizeof(header1))==-1) {
        perror("header1 write error!");
        exit(1);
}

if(write(sock, header2, sizeof(header2))==-1) {
        perror("header2 write error!");
        exit(1);
}

while(read(sock, buf, sizeof(buf))!=0) {
        fp=fopen("result.html", "a");
        fprintf(fp, "%s\n", buf);
        fclose(fp);
}

close(sock);
return 0;
}

보시다시피, 코딩 자체는 별루 안어려운데 제가 http 프로토콜과 html에 대해 잘 몰라서 이게 어렵네요.ㅡㅡ;
이걸 실행해서 나온 result.html과 웹브라우저에서 로그인하면서 세이클럽 서버에서 받아오는 패킷을 캡쳐해서 비교해보면 다른 값이 나옵니다.
아마두 위에서 header 배열값을 제가 잘못 준게 이유인거 같은데요..
정확히 무엇 때문에 이렇게 다른 결과값이 나오는지를 모르겠네요..

그리고 http post 요청시 꼭 넣줘야 하는 헤더에는 어떤 것들이 있나요?
위에선 Content-Length 값을 어떻게 계산하는지 몰라서 뺐는데 상관없는거 같네요..

psycoder의 이미지

저도 오래전에 만들어봤던 기억이 있네요.
근데 내공부족으로 하다가 포기했었지요. :oops:
이글을 보니 다시 한번 도전하고픈 욕구가 샘솟네요. :)
그럼 혹시 알게되면 답변 드리겠습니다.
쓰고보니 전혀 도움이 안되는 답변이였네요..죄송.. :oops:

evonit의 이미지

RFC 의 http 프로토콜을 보시면 빠릅니다.

post전송시 파라미터를 헤더로 쏘기땜
content-length: 파라미터값
식으로 있어야됩니다.
그리고 rfc protocol 규격서가 보기 힘드시면
간단하게 http server를 만드셔서 브라우저로 접속해보셔도 됩니다.

Yuie.
Evonit Community

feanor의 이미지

HTTP를 공부하시려면, 모질라의 Live HTTP Headers 확장을 추천해 드립니다.

http://extensionroom.mozdev.org/more-info/livehttpheaders

웹브라우저에서 링크를 클릭하면 브라우저와 서버 사이에 오가는 HTTP 헤더를 실시간으로 볼 수 있습니다.

--feanor

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.