옛날에 동아리 클럽에 썼던 글입니다.

============================================================================================

1. 함수 원형

BOOL QueryInternet(const char *szAddress,UINT nPort,UINT nQuery)

2. 인자 설명
szAddress : 쿼리 요청을 보낼 주소
nPort : 포트번호
nQuery : 쿼리 횟수

3. 헤더 파일
  1. wininet.h (?)

4. 함수 코드
BOOL QueryInternet(const char *szAddress,UINT nPort,UINT nQuery)

{

/*

Return -1 : 포트번호입력오류

Return 2 : InternetOpen() 함수에러

Return 3 : InternetConnect() 함수에러

Return 4 : HttpOpenRequest() 함수에러

Return 0 : 정상

*/

 

 if(nPort<=0 || nPort>65535)

{

return -1;

}

 

HINTERNET hIOpen = InternetOpen("TestWeb",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);

if ( hIOpen == NULL )

return 2;

UINT i;

for(i=0;i<nQuery;i++)

{

HINTERNET hIConnect = InternetConnect(hIOpen,szAddress,nPort,NULL,NULL,INTERNET_SERVICE_HTTP, 0, 0);

if ( hIConnect == NULL )

{

InternetCloseHandle(hIOpen);

return 3;

}

// Request the file from the server.

 //LPCTSTR ppszAcceptTypes = "text/*" ;

HINTERNET hIReq = HttpOpenRequest(hIConnect,

NULL, // "Get"

NULL,

(LPCSTR)HTTP_VERSION,

NULL, //(LPCSTR )csUrlCon,

NULL,//&ppszAcceptTypes,

INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE,

0);

if ( hIReq == NULL){

InternetCloseHandle(hIConnect);

InternetCloseHandle(hIOpen);

return 4;

}

// Send the request.

HttpSendRequest(hIReq, NULL, 0, NULL, 0);

BYTE pBuffer[8192]={0,};

DWORD dwBytesRead;

InternetReadFile(hIReq,pBuffer,8192,&dwBytesRead);

// Close all of the Internet handles.

InternetCloseHandle(hIReq);

InternetCloseHandle(hIConnect);

}

InternetCloseHandle(hIOpen);

}

 

==========================================================================================================================

BSD용으로(리눅스&OSX) 변환 연습해봐야지,,,

'생활 > 소켓프로그래밍' 카테고리의 다른 글

소켓 프로그래밍의 기초(2)  (0) 2010.02.05
소켓 프로그래밍의 기초(1)  (0) 2010.02.05

아래 내용들은 윤성우 저자의 "지피지기 TCP/IP소켓 프로그래밍" 책의 내용을 바탕으로 본인이 읽고 새로 정리한 내용들이니,
다소의 오류가 있을 수도 있습니다.


서버 소켓 기본 코드
[code cpp]
/*
* helloWorld_server.c
* Written by SW.YOON
* Edited by Michael YOON
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define default_PT 89123

void error_handling(char *message);

int main(int argc, char ** argv)
{
    int serv_sock;
    int clnt_sock;
    struct sockaddr_in serv_addr;
    struct sockaddr_in clnt_addr;
    int clnt_addr_size;
    char message[]="Hello World!\n";

    if(argc>1)
    {
        printf("Usage : %s <port>\n" ,argv[0]);    //사용법
        printf("Default port is 89123\n");
    }
////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////기본 소켓 생성 설정/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
    serv_sock=socket(PF_INET, SOCK_STREAM,0);    //서버소켓 만들기
                                //PF_INET은

    if(serv_sock == -1)
        error_handling("socket() error");        //서버소켓 만들기 실패 시

    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(argc==2)
    {
        serv_addr.sin_port = htons( atoi(argv[1]) );
    }
    else
    {
        serv_addr.sin_port = htons( atoi(default_PT) );
    }

    if( bind( serv_sock, (struct sockaddr* )&serv_addr, sizeof(serv_addr) ) == -1 )
    {
        error_handling("bind() error");
    }

    if( listen(serv_sock,5) == -1 )
    {
        error_handling("listen() error");
    }
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
    clnt_addr_size = sizeof(clnt_addr);
    clnt_sock=accept( serv_sock, (struct sockaddr*) &clnt_addr, &clnt_addr_size );
                                /* 연결 수락 */
    if(clnt_sock == -1)
        error_handling("accept() error");    write( clnt_sock, message, sizeof(message) );        /* 데이터 전송 */
    close(clnt_sock);                        /* 연결 종료 */
    return 0;
}

void error_handling(char *message)
{
    fputs( message, stderr );
    fputc( '\n', stderr);
    exit(1);
}

[/code]

기본 연결포트는 89123포트로 설정해 놓았습니다.

우선 하나하나 코드를 살펴보면




22줄. 클라이언트 소켓을 선언합니다.




24줄. 클라이언트의 IPv4주소체계를 기록하는 구조체이다.


25줄. 클라이언트 IPv4 주소 구조체의 크기를 기록하는 구조체이다.


26줄. 간단히 Hello World! 문자열을 출력하기 위한 문자배열이다.


28~32줄. 인자의 개수를 파악하여 사용법을 알려주기도 한다.

















'생활 > 소켓프로그래밍' 카테고리의 다른 글

인터넷 쿼리함수(windows용)  (0) 2012.03.10
소켓 프로그래밍의 기초(1)  (0) 2010.02.05

아래 내용들은 윤성우 저자의 "지피지기 TCP/IP소켓 프로그래밍" 책의 내용을 바탕으로 본인이 읽고 새로 정리한 내용들이니,
다소의 오류가 있을 수도 있습니다.

   

  1. 소켓의 이해.
    1. 서버프로그램.
      서버프로그램의 작동은 크게 x가지 과정으로 나뉜다.
      1. 소켓 생성
        int socket(int domain, int type, int protocol);
        함수를 이용해 소켓을 생성한다.
        (헤더 "sys/type.h", "sys/socket.h")
      2. 소켓 바인딩
        int bind(int sockfd, struct sockaddr *myaddr, int addrlen);
        함수를 이용하여 소켓에 주소 및 포트를 할당한다.
      3. 리스닝
        int listen(int sockfd, int backlog);
        함수를 이용하여 소켓에 연결이 준비한다.
      4. 엑셉트
        int accept(int sockfd, struct sockaddr *addr, int *addrlen);
        함수를 이용하여 클라이언트와 연결한다.
    2. 클라이언트 프로그램.
      클라이언트 소켓의 작동은 크게 x가지 과정으로 나뉜다.
      1. 소켓 생성
      2. 컨넥트
        int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
        함수를 이용하여 서버와 연결한다.

'생활 > 소켓프로그래밍' 카테고리의 다른 글

인터넷 쿼리함수(windows용)  (0) 2012.03.10
소켓 프로그래밍의 기초(2)  (0) 2010.02.05