기본 콘텐츠로 건너뛰기

라벨이 TCP/IP소켓 프로그래밍인 게시물 표시

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는

TCP/IP소켓 프로그래밍 아래 열 수 있는 파일개수 변경

getrlimit함수를 이용해 현재 프로세스가 열수있는 파일의 제한값을 가져온 후 1024값씩 추가시켜줌. 아래는 출력결과 컴파일시 3개의 경고문이 뜨는데 그냥 무시.... warning은 무시무시무시~~  에러인줄 알고 순간 당황했지만 당황하지 않고 빠른 실행~  

TCP/IP소켓 프로그래밍 표준입출력을 이용한 출력 프로그램

memset으로 메모리 초기화를 해주고( 직접 초기화를 해주어야 한다.) read 함수에서 입력을 기다린후 write함수에서 출력.. 그냥 prinf랑 scanf..... 전달 인자값만 다를뿐.... 아래는 출력 결과

TCP/IP소켓 프로그래밍 프로그램의 반환 값..

프로그램이 성공을 하게 되면 0값을 반환하게 된다. 실패를하게 되면 0보다 큰 수를 반환하게 된다. 논리연산에서는 0값은 거짓, 0이외의 수는 참값이 되는데 왜 실패를 하게될떄 0보다 큰수를 반환하게 될까? 에러로 인하여 프로그램이 실패할시 어떠한 에러로 인하여 프로그램이 종료됬는지 쉽게 알려주기 위함이다. 만약에 에러로인하여 종료가 될시 0으로 통일된 값이 반환될 경우  프로그래머는 어느 부분에서 에러가 발생 했는지 디버깅 하기가 쉽지는 않게된다. 그래서 프로그램이 성공하면 0값을 반환하게 되고 에러로 프로그램이 실패하게 되면 각각에 따른 0을 넘는 숫자가 반환이 된다. socket 에러 : 1값 반환 connet 에러 : 2값 반환 database 에러 : 3값 반환 알수 없는 에러 : 4값 반환 이렇게 각각에 따른 반환값을 주게 된다. 반드시 이렇게 하는것은 아니지만  이렇게 반환값을 줌으로써 좀더 빠른 디버깅을 할수 있게 될것이다. 이처럼 구현을 할수 있을 것이다. int re = 특정 함수; 1 2 if ( ! re) { 정상 실행} else  {re출력} cs 이런식으로 구현이 될 것이다 .

TCP/IP소켓(socket) 프로그래밍 에코서버(echo Server)와 에코 클라이언트(echo client)구현.....

하 socket함수랑 bind함수만 좀 공부하고 그냥 바로 예제 코드로 넘어감 바로 구현해보는게 더 이해도가 높을것으로 판단..... 이제 다시 소스 분석을.........대충 흐름은 알것 같긴하다... ㅋㅋ 따라 치기만 했는데도 먼가 자꾸 에러가 ㅋㅋㅋ 에러 찾는데도 시간이 은근히 잡아먹혀서 애좀 먹음;; 살짝식 바꿔가면서 따라쳤다가 결국은 예제 그대로 침;; ㅋㅋㅋㅋ 따라치기만 하면 재미 없어서~~ 에코 클라이언트 소스  tc.c 파일 에코 서버 소스가 된다.  t.c 파일 아직 코드분석은 끝나지 않았는데... 자세히 보면 exit(0)부분을 주석 처리 하였다 이유는 컴파일시 에러는 아닌데 자꾸 waring이 뜨는데 보기 싫어서 주석처리로 해결...... 사실 scanf()함수도 컴파일시 waring은 떴었지만 ㅋㅋㅋㅋ 이렇게 소스를 짰으니 컴파일 후 서버를 실행시켜서 클라이언트로 접속을.... 해봐야지~~ 컴파일을 완료하였다 컴파일시 gcc -o echo_client t.c,  gcc -o echo_client tc.c fh 컴파일 하였는데  -o는 컴파일후 실행파일의 이름을 지어주는것이다.  gcc tc.c 이런식으로 하면 무조검 a.out로 되기때문에 여러개를 컴파일 할 수가 없게 된다. 그리고 에코 클라이언트, 에코 서버 2개의 터미널 창을 띄어야 하므로 startx를 쳐서 GUI모드로 가서 실행을~ 클라이언트가 접속할 수 있게끔 서버를 연다 3500포트를 열어준것이다. 그럼 이제 클라이언트로 접속을 하자 클라이언트에서 서버에 접속을 하는순간 서버 터미널 창에서는 접속한 ip주소가 뜨게 된다  루프백 주소를 사용하여 구현을 하였기 때문에 루프백 주소인 127.0.0.1이 뜨게 된다 클라이언트에서 Hellow World를 입력하자 서버는 그것을 다시 클라이언트에세 되 돌려준것이다. 하 socket함수랑 bind함수만 좀 공부하고 그냥 바로 예제 코

TCP/IP소켓 프로그래밍 Backtrack을 올렸다.....

우분투로 하다가 우분투 기반의 리눅스 버전인 백트랙을 올렸다.. 백트랙에서는 CUI와 GUI 둘다 지원이 되서 그런지 vi를 사용할 때는 backtrack이 더 편한것 같다 일단 상단에 vmware바가 화면을 가리지 않아서 좋다.    처음 부팅시 위 사진의 화면으로 부팅이 된다. 저기서 로그인을 한뒤에 startx를 쳐주면 아래사진처럼 이동하게 된다.  그리고 로그아웃을 하면 다시 위 사진 처럼 전환이 된다.. vi를 할 때는 위 사진 같이 cui 모드에서 하는것이 좀더 편해서(터미널은 뭔가에 갇혀있는 듯한 느낌이랄까?) 백트랙을 올렸다 우분투에서도 있는지는 잘모르겠다.... ㅋㅋㅋ 일단 당분간 이걸로 할듯 그리고 vi에디터가 방향키가 먹혀서 신기.... 우분투에서는 습관적으로 방향키를 누르면 영어가 떠서 좀 짜증났었는데...  근데 방향키보다 hjkl키를 써서 방향전환을 한다면 좀 더 빠른 코딩을 할 수 있을거같기는 하다... 일단 어제 공부를 못했으니 오늘은 열심히 해야겠다...

TCP/IP소켓 프로그래밍 error.....

소켓플그래밍을 공부중입니다.  우선 socket()함수를 이용하여 socket을 생성하였습니다.  그리고 bind()라는 함수를 이용하여 소켓의 속성. 즉, 소켓의 Ip주소, Port번호를 부여를 해줍니다.  서버 같은 경우는 어떤 클라이언트 포트와 연결을 할지 기다리게 되고 클라이언트 같은 경우에는 연결할 서버의 포트 번호가 된다. 책에 나온 예제를 보면서 열심히 따라? 침......(예제 소스가 아니라 부분부분으로 나눠서 설명되있는 것을 하나로 묶어서 침) 두둥.... 과연 컴파일 결과는... 에러야 안녕!! 내가 널 없애주마!!!! 수많은 에러 발생 하하 기분이 좋다.  신이시여 저에게 에러를 주셔서 감사합니다.....  이제 열심히 에러를 찾아봅시다. 대충보면 대부분이 선언이 되지 않아 생긴 에러인듯 싶다..... 분명 책에는 선언해준게 없었는데 열심히 찾아봐야겠다....