기본 콘텐츠로 건너뛰기

TCP/IP소켓 프로그래밍 데이터 읽고 쓰기 - rade/write, 연결종료 - close

서로 소켓이 만들어 생성되고 연결을 했다면 데이터를 읽고 써야 통신이 될것이다. 이때 데이터를 읽을떄는 read함수를 쓸떄는 write함수를 이용하게 된다.. 우선 read함수부터.... read함수를 이용해서 데이터를 읽게 된다. read함수의 원형을 보면.... 1 2 #include   < unistd.h > ssize_t read( int  fd,  void   * buf, size_t count); cs 매개변수 fd : 열린파일의 지정번호이다. 소켓프로그래밍에서는 소켓 지정 번호가 된다. 클라이언트에서는 socket 함수로 생성된 소켓이고,      서버프로그램에서는 accept함수로 생성된 소켓 번호이다. buf : 읽어들인 데이터가 저장될 버퍼 변수이다. count : 읽어들일 데이터의 크기가 된다. 반환값은 성공시 데이터의 크기를반환하고, 실패시 -1을 반환한다. 예제코드 fd에서 count만큼 크기를읽어 buf에다가 저장을 하게된다. 1 2 3 4 int  readn; char  buf[ 80 ]; memset(buf,  0x00 ,  80 ); readn  =  read(sockfd, buf,  80 ); cs sockfd로부터 80만큼의 크기를 읽어서 buf에다가 저장. ==================================== 이제 write 함수를 이용하여 데이터를 서보자. 함수의 원형을 살펴보면 1 2 #include   < unistd.h > ssize_t write( int  fd,  const   void   * buf, sizr_t count); cs 매개변수 fd : 연결된 소켓 지정 번호 buf : 보낼데이터가 저장되어 있는 버퍼 count : 보낼 데이터의 크기 반

TCP/IP소켓 프로그래밍 socket-소캣생성, bind-소캣 정의 listen수신 대기열 생성 accept 연결 기다리기

소켓 생성(socket) - 듣기소켓이라고 함.. 소켓 정의(bind) - ip주소, port번호를 할당해줄수 있다 대기열 생성(listen) - 만약 어떠한 클라이언트가 서버를 사용하고 있다면 또 다른 클라이언트는 종료가 되겠지만 대기열이 있다면 대기열에서 기다림 연결수락(accept) - 대기열에 클라이언트가 있다면 크 클라이언트와의 연결을 허용한다. 데이터 통신 (read. write) 소켓 종료(close) 우선 서버의 흐름은 이렇게 된다. 클라이언트보다 좀더 복잡한 구성을 가지고 있다.  1. 소켓생성 소켓을 생성하기에앞서 헤더파일을 선언해준다. 1 2 #include   < sys / types.h > #include   < sys / socket.h > cs 헤더를 선언해준다. 함수의 원형은 1 int  socket( int  domain,  int  type,  int  protocol); cs 이된다 이 부분은 헤더 내부에 이미 선언이 되었다. 각매개변수는  nt domain  어떤 영역에서 통신할래? AF_UNIX : 시스템 내부 영역에서 프로세스와 프로세스간 통신 AF_INET : 물리적으로 서로 멀리 떨어진 컴퓨터 사이 통신 일반적으로 IPv4를 이용 int type 어떤 프로토콜 사용할래? SOCK_STREAM : tcp/ip 사용 SOCK_DGRAM : UDP사용 SOCKRWA : TCP/IP의 복잡함 감춤.... 먼솔.... 21장에 나온단다.... int protocol 도메인과 유형에 따라 사용할 프로토콜 결정 IPPROTO_TCP : AF_INET과 SOCK_STREAM 유형과 함께 사용 IPPROTO_UDP : AF_UNIX와 SOCK_DGRAM 유형과 함께 사용 socket 함수는 int 값 반환한다. -1이면 실패, 0이

TCP/IP소켓 프로그래밍 에코 서버 프로그램 분석

  우선 헤더파일 선언..... #include <sys/socket.h> #include <sys/stat.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #Include <unistd.h> sys/socket.h 헤더파일은 socket()함수, bind()함수, listen()함수, accept()함수를 사용하기 위해 선언을 해준다.. sys/socket.h 헤더파일 내부에  socket(), bind(), listen(), accept()함수들의 정의부분이 선언이 되있기 때문에 굳이 정의를 할 필요가 없다. string.h 헤더파일은 memset(), bzero() 함수. 메모리를 초기화 해주는 함수를 사용하기 위해선언. unistd.h 헤더파일은 read(), write(), close() 함수를 사용하기 위해선언  main문은 실행시 인자를 받을수 있게 argc, argv[]가 매개변수로 되어있다. 여기서 인자는... 바로 포트번호가 되겠다. 사용자가 원하는 포트를 열수 있게끔 ./파일이름 포트번호 이렇게 실행을하게 된다.....  11~14 행   inr server_sockfd, client_sockfd; 서버와 클라이언트의 소켓 지정 번호를 저장 하는 변수 int client_len,n ;  클라이언트의 길이를 저장하는 변수 char buf[MAXBUF]; 전송을 주고 받을수 있는 최대 길이, MAXBUF값이 1024이므로 1024개의 문자 만큼 받을수 있다. 16행   client_len= sizeof(clientaddr); 클라이언트의 길이를 저장, 어차피 struct sockaddr_in의 구조체에 저장 되있는 변수들의 총 합의 메모리 크기만큼 저장이 된다. 18~22행   if((server_so

TCP/IP소켓 프로그래밍 파일 복사 프로그램

이건 파일을 실행할때 두개의 파일을 인자로 받는다.  int main(int argc, char **argv) 는 프로 그램 시작시 인자를 받는데 argc는 인자의 갯수, argv는 인자의 값에 해당한다  이프로그램에서는 파일의 갯수와 파일의 명이 해당 하겠다. 첫번째 if 문에서 인자 갯수를 검사한다. 두번째 이프분에서는 원본파일을 읽기 전용으로 열게끔 한다 세번째 이프문은 먼지를 잘 모르겠는데 주석처리를 하고 출력을 해보았다 . 주석처리를 해 주었음에도 정상적인 출력이 가능하다... 이부분은 어떤 부분인지를 잘 모르게는데...... open()함수에 파일명과 어떤값을 인자로 전달을 하고....... 에러가 뜨면 종료..  과연 어떤것을 인자로 전달하는 것일까?? 자세히 보면 |로 bit연산(OR연산) 저중 하나라도TRUE면 TRUE값을 전당.... 머지? ㅋㅋㅋ 그리고 네번째 if문에서는 파일이 존재하면 프로그램을 종료한다. 아 파일을 닫는 걸 안집어 넣었네 ㅋㅋㅋㅋ 이러면 프로그램은 종료가 됬는데 파일은 계속 열여 있는상태가 되는건가??.. 음.... 메모리가 계속 차지하고 있겠지?? 암튼 다음 함수를 추가해주자  close(dest_fd); 다음과 같이 수정을 하면 된다.......  1 2 3 4 5 6 if (errno  = =  EEXIST) {           perror( "ERROR" );           close(dest_fd);            return   1 ; } cs 이것을 추가해주면 파일을 닫고, 프로그램을 종료하게 된다.  마지막 while문에서는 원본파일을 MAXLINE만큼 buf에다가 저장하고 readn에다가 쓴다. readn을 출력하고 memset을 이용하여 buf의 메모리공간을 깨끗히 비워준다 이렇게 다 쓰고난 buf는