본문 바로가기

교육/Network

네트워크 프로그래밍 4/5



코드마다 error의 의미가 다름


man 2 listen


은행이라고 생각하면
창구에서 받을 수 있는 인원이 3명이고 대기자공간이 5명이라면
창구에서 받을 수 있는 인원을 늘리는 것이 PC / LAN / OS에 따라 다르며 /* (처리하는 것)
대기자를 늘리는 것은 메모리에 따라 다르다. (대기자 = 대기큐) /* (기다리는 것)

- 일반적으로 대기큐를 늘리는 것 보다 넘치는 인원을 거절하는게 나음 -
- 대기큐는 거의 5로 설정 -

listen(소켓번호, 대기큐);

Server.c Connect.c
socket socket
bind connect
listen close

block 
ex : scanf ( (scanf는 키 입력전까지) 대기하는 것을 블록킹이라한다.)

대기하지않는 것을 넌블록킹이라고한다.





accept(소켓번호, 주소, );
accept(isock,(struct sockaddr *) &stClient1, &uisize);










client.c

      1 #include <sys/types.h>
      2 #include <sys/socket.h>
      3 #include <sys/stat.h>
      4 #include <arpa/inet.h>
      5 //include </usr/include/linux/in.h>
      6 #include <errno.h>
      7
      8 int main()
      9 {
     10     int isock;
     11     //소켓서술자
     12     struct sockaddr_in staddr;
     13     //네트워크의 연결을 처리하기위해 주소를 저장하는 구조체
     14     int iret;
     15     unsigned char ucBuff[250];
     16
     17     /*>>>>소켓열기<<<<*/
     18     isock = socket(AF_INET,SOCK_STREAM,0);
     19     //1.인터넷으로 연결된 프로세스들 간에 통신한다.(AF_INET)
     20     //A = ADDRESS / F = Family / INET = 인터넷 의 약자
     21     //2.TCP 방법을 이용해 통신한다.(SOCK_STREAM)
     22
     23     if(isock == -1)
     24     {
     25         perror("isock() : ");
     26
     27         return -1;
     28     }
     29
     30     staddr.sin_family = AF_INET;
     31     staddr.sin_port = htons(PORT);
     32     //port의 경우 우리가 지정해 주어야 한다.
     33     //상대방은 무조건 port번호가 4000번이어야 한다. 4000번에 접속할 예정임.
     34     staddr.sin_addr.s_addr = inet_addr("192.168.10.250");
     35     //staddr의 네트워크를 연결하기전에 주소와 포트등을 셋팅해준다. (IP ADDRESS)
     36
     37
     38     iret = connect(isock,((struct sockaddr *)(&staddr)),sizeof(staddr));
     39     //원형 man connect
     40     /*int connect(int sockfd, const struct sockaddr *serv addr, socklen_t addrlen);*/
     41     //연결함
     42
     55     }
     45         perror("connect() : ");
     46         //나머지 메시지를 알아서 적어준다. connect에서 error가 난걸 알기 쉽게하기 위해
     47         //connect를 적어준것임.
     48         close(isock);
     49
     50         return 0;
     51     }
     52
     53     printf("%d\n",isock);
     54
     55 /*---------------------------Read----------------------------*/
     56
     57     iret = read(isock,ucBuff,sizeof(ucBuff));
     58     //read는 읽어온 바이트 수 만큼 return 해준다.
     59     ucBuff[iret] = 0;
     60     //읽어온 바이트수인 "welcome"까지 return받고 뒤에 Null값을 줌.
     61
     62     printf("%s \n",ucBuff);
     63
     64 /*-------------------------Read End---------------------------*/
     65
     66 /*---------------------------Write----------------------------*/
     67
     68     write(isock,"Hello",5);
     69
     70 /*-------------------------Write End--------------------------*/
     71
     72 //************************************************************//
     73     iret = read(1,ucBuff,sizeof(ucBuff));
     74 //  read(키보드(stdin),...,...);
     75
     76     write(isock,ucBuff,iret - 1);
     77
     78 //************************************************************//
     79
     80     /*>>>>소켓닫기<<<<*/
     81     close(isock);
     82
     83     return 0;
     84 }

-> //****************//의 사이 72~78
read로 키보드로 치는것(stdin)의 정보를 읽어들이고 write로 쓰고있다.



 

server.c

      1 #include <sys/types.h>
      2 #include <sys/socket.h>
      3 #include <sys/stat.h>
      4 #include <arpa/inet.h>
      5
      6
      7 int main()
      8 {
      9     int isock;
     10     int iClient1;
     11     int iret;
     12     unsigned int uisize;
     13     struct sockaddr_in staddr;
     14     struct sockaddr_in stClient1;
     15     unsigned char ucBuff[250];
     16
     17     isock = socket(AF_INET,SOCK_STREAM,0);
     18
     19     if(isock == -1)
     20     {
     21         perror("isock() : ");
     22
     23         return -1;
     24     }
     25
     26     staddr.sin_family = AF_INET;
     27     staddr.sin_port = htons(PORT);
     28 //  각자다른 포트번호를 가진다. (출석번호)
     29     staddr.sin_addr.s_addr = inet_addr("192.168.10.250");
     30
     31
     32     iret = bind(isock,((struct sockaddr *)(&staddr)),sizeof(staddr));
     33 //  bind(소켓번호, 구조체주소(&로 캐스팅/서버의주소)
     34 //  내주소와 소켓을 결합시킬 때에 쓰는 함수를 bind라 한다.
     35
     36     if(iret == -1)
     37     {
     38         perror("bind() : ");
     39
     40         close(isock);
     41
     42         return 0;
     43     }
     44
     45
     46     iret = listen(isock,5);
     47
     48
     49     if(iret == -1)
     50     {
     51         perror("listen() : ");
     52         close(isock);
     53
     54         return 0;
     55     }
     56
     57     uisize = sizeof(stClient1);
     58     iClient1 = accept(isock,(struct sockaddr *) &stClient1, &uisize);
     59 //  accept가 socket을 만들어낸다 socket을 내부적으로 가지고있다.
     60 //  return 값도 socket과 같음. accept가 리턴되면 소켓이 만들어진다.
     61 //  새로운 소켓을 저장할만한 변수를하나 새로 만들어야함. = iClient
     62
     63     if(iClient1 == -1)
     64     {
     65         perror("listen() : ");
     66         close(isock);
     67
     68         return 0;
     69     }
     70
     71     printf("%d\n",isock);
     72     printf("%d\n",iClient1);
     73
     74 /*-----------------------Write-------------------------*/
     75
     76     write(iClient1,"Welcome",7);
     77
     78 /*------------------------Read-------------------------*/
     79     iret = read(iClient1,ucBuff,sizeof(ucBuff));
     80     ucBuff[iret] = 0;
     81
     82     printf("%s \n",ucBuff);
     83 /*---------------------Read End------------------------*/
     84
     85 //************************************************************//
     86     iret = read(iClient1,ucBuff,sizeof(ucBuff));
     87     ucBuff[iret] = 0;
     88
     89     printf("%s \n",ucBuff);
     90 //************************************************************//
     91
     92     close(isock);
     93     close(iClient1);
     94
     95     return 0;
     96 }

-> //********//의 사이 85~90
client에서 write로 썼던 정보들을 read로 읽고 출력하고있다.

1. 먼저 접속할 server를 열어준다.
2. client로 server에 접속한다.
<────────> Hello와 Welcome 각각의 read와 write값이 써진다.



//*****//의 사이에있던 정보들을 시험한결과.

read(1,...,...); 으로 키보드의 입력값을 받아와 write하는게 성공적으로 작동되었다.
client에서 키보드값을 쓰면 server에서 write한다.





->dos에서 파일을 ftp로 전송하는 법

ftp 192.168.10.250
아이디
비밀번호
bin
보낼 파일의 이름과 확장자.



  
->멀티 프로세스
ㄴ...
->멀티 쓰레드
ㄴ...
->select 함수
ㄴ...
  



'교육 > Network' 카테고리의 다른 글

네트워크프로그래밍 6/7  (0) 2014.06.23
네트워크 이론 2 & 네트워크 프로그래밍  (0) 2014.06.13
Network 이론 1  (0) 2014.06.10