1. Client Program 

- 소켓 생성 및 서버의 ip주소/ 포트번호 인식 필수 

- socket(), connect(), read() 등의 소켓 관련 API함수 사용.


2. Client 순서 

- 소켓을 생성 

- 연결할 서버의 주소를 설정

- 소켓을 서버에 연결

- 서비스 요청과 처리

- 소켓 연결을 종료 



3. 소스 코드


#include <stdio.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <ctype.h> // memset(), strlen() 함수 사용을 위한 헤더 

#include <string.h> 


#define PORT 9000

#define IPADDR "127.0.0.1"


int main()

{

  int c_socket;

  struct sockaddr_in c_addr;

  int len;

  int n;


  char rcvBuffer[BUFSIZ];  // 서버로부터 오는 문자열을 저장할 버퍼 


  c_socket=socket(PF_INET, SOCK_STREAM, 0);  // 소켓 생성


  memset(&c_addr, 0, sizeof(c_addr));  // c_addr구조체 선언 

  c_addr.sin_addr.s_addr=inet_addr(IPADDR);  // IPADDR은 위에 define으로 선언했듯이 자기자신인 127.0.0.1

  c_addr.sin_family=AF_INET;  

  c_addr.sin_port=htons(PORT); // 포트번호는 9000번 


  if(connect(c_socket, (struct sockaddr *) &c_addr, sizeof(c_addr))== -1){  // 소켓을 서버에 연결하기. 

    printf("Can not connect \n");

    return -1;

  }


  if((n=read(c_socket, rcvBuffer, sizeof (rcvBuffer)))>0){  // 서비스 요청과 처리 (서버로 부터 오는 문자열을 읽어서 rcvBuffer에 넣음)

    return -1;

  }


  rcvBuffer[n]='\0';  // 문자열의 끝을 나타내는 널값 입력 

  printf("received Data: %s\n", rcvBuffer);  // 서버로 부터 온 문자열을 클라이언트 화면에 출력


  close(c_socket);  // 소켓 종료 

  }

'웹소켓' 카테고리의 다른 글

hello_server.c  (0) 2018.10.31
소켓 프로그래밍 맛보기  (0) 2018.10.31

1. 프로그래밍 환경 


- ATOM Editor




- c/c++을 사용하기 위해선 gpp-compiler 패키지 필요




2. hello_server.c 


#include <stdio.h>  //표준 입출력

#include <netinet/in.h>

#include <sys/socket.h>

#include <string.h> // write, close를 위해

#include <ctype.h> // memset, strlen 위해


#define PORT 9000 // 포트 9000으로 지정


char buffer[BUFSIZ]="hello, world";


int main()

{

  int c_socket, s_socket;

  struct sockaddr_in s_addr, c_addr;

  int len;

  int n;



s_socket= socket(PF_INET, SOCK_STREAM,0);  //tcp용 소켓 생성


memset(&s_addr, 0, sizeof(s_addr));

s_addr.sin_addr.s_addr=htonl(INADDR_ANY);

s_addr.sin_family=AF_INET;

s_addr.sin_port=htons(PORT);          /// port와 ip주소 설정(ip는 모두,, 받아들인다는 뜻에서 INADER_ANY사용)


if(bind(s_socket, (struct sockaddr *) &s_addr, sizeof(s_addr))== -1){

  printf("Can not Bind \n");

  return -1;                     // 소켓을 포트와 연결

}


if(listen(s_socket ,5)==-1){

  printf("listen Fail \n");

  return -1;

}                              // 커널에 개통 요청


while(1){


  len=sizeof(c_addr);

  c_socket=accept(s_socket, (struct sockaddr *) &c_addr, &len);  // 클라이언트로부터 연결 요청을 수신(연결 요청을 s_socket<듣기소켓>이 받으면, 자료 송수신시 사용하는 c_socket<연결소켓>으로 반환)


  n=strlen(buffer);

  write(c_socket,buffer,n); // 클라이언트에게 서비스 제공


  close(c_socket);  // 클라이언트와 연결 종료

}


close(s_socket); // 서버 종료 


}



'웹소켓' 카테고리의 다른 글

hello_client.c  (0) 2018.11.01
소켓 프로그래밍 맛보기  (0) 2018.10.31

1. 클라이언트와 서버


   - 클라이언트 --------------------> 서버 

      // 연결 요청(소켓 API함수를 호출 -> 서버 프로그램에 연결 요청)

 

   - 서버 ------------------->  클라이언트  

     // 문자열 전송(요청 받은 서버는 연결되자마자 문자열을 클라이언트에게 전송)

  

   - 클라이언트 --------------------> 서버 

     // 화면 출력(클라이언트는 전송받은 문자열을 자신의 화면에 출력)



2.  소켓 프로그래밍(Server)  관련 함수

  

 처리과정

관련 함수 

비유 

 소켓을 생성 

socket() 

전화기 준비 

 연결 요청을 수신할 주소 설정

 

회사 대표전화와 내선 번호 준비 

 소켓을 포트에 연결

bind() 

전화기를 준비한 내선에 연결 

 커널에 개통 요청 

listen() 

전화국에 개통 요청 

 연결 요청을 수신 (기다림)

accept() 

전화를 기다리다가 전화가 오면 받음 

 클라이언트에게 서비스를 제공 

read() / write() 

전화 통화 

 클라이언트와의 연결 종료 

close() 

전화 끊기  




3. telnet 연결 


 $ telnet host [포트번호]


 - 포트번호 : 기본값은 23번 

   (그러나 대부분 보안상 23번 포트 연결을 허용안됨. 따라서 지정해줘야함. 보편적으로 9000번이나 9080번을 사용.)

 

- 자기자신

    $telnet 127.0.0.1  또는 $telnet localhost 


'웹소켓' 카테고리의 다른 글

hello_client.c  (0) 2018.11.01
hello_server.c  (0) 2018.10.31

+ Recent posts