[질문]소켓플밍으로 간단한 http client 만들어봤는데요
글쓴이: gostop / 작성시간: 화, 2004/04/13 - 7:26오후
요즘 소켓 프로그래밍을 배우는 중이여서 아주 간단한 세이클럽에 로그인하는 웹클라이언트를 만들어봤습니다.
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 값을 어떻게 계산하는지 몰라서 뺐는데 상관없는거 같네요..
Forums:
저도 오래전에 만들어봤던 기억이 있네요.근데 내공부족으로 하다가 포기
저도 오래전에 만들어봤던 기억이 있네요.
근데 내공부족으로 하다가 포기했었지요. :oops:
이글을 보니 다시 한번 도전하고픈 욕구가 샘솟네요. :)
그럼 혹시 알게되면 답변 드리겠습니다.
쓰고보니 전혀 도움이 안되는 답변이였네요..죄송.. :oops:
http protocol
RFC 의 http 프로토콜을 보시면 빠릅니다.
post전송시 파라미터를 헤더로 쏘기땜
content-length: 파라미터값
식으로 있어야됩니다.
그리고 rfc protocol 규격서가 보기 힘드시면
간단하게 http server를 만드셔서 브라우저로 접속해보셔도 됩니다.
Yuie.
Evonit Community
HTTP를 공부하시려면, 모질라의 Live HTTP Headers 확장을
HTTP를 공부하시려면, 모질라의 Live HTTP Headers 확장을 추천해 드립니다.
http://extensionroom.mozdev.org/more-info/livehttpheaders
웹브라우저에서 링크를 클릭하면 브라우저와 서버 사이에 오가는 HTTP 헤더를 실시간으로 볼 수 있습니다.
--feanor
댓글 달기