본문 바로가기
코스웨어/16년 스마트컨트롤러

20160415_장진웅_업무일지_공장내Network_일대일통신_입출력다중화(원시적인 채팅 프로그램)

by 알 수 없는 사용자 2016. 4. 16.
728x90
반응형

첫번째 작품

 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <string.h>

 int main(void)
 {
     int iSock;//변수를 저장할 공간이 필요하다.
     int iLen;//구조체 길이를 저장하기 위해 사용한다.
     char caBuff[250];
     int iRet;
     struct sockaddr_in stServer;//접속하거나 네트워크에 사용될 IP, PORT번호가

     iSock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//open과 같은 역할, 네트워

     if(iSock<0)
     {
     printf("can not make a socket \n");
     return 0;
     }

     memset(&stServer, 0, sizeof(stServer));
     //위 설명: memset -> mem은 mem, set은 세팅, 즉. 메모리를 세팅한다는 뜻이?
     //위 설명(계속): &stServer는 메모리
     //위 설명(계속): 0는 초기화 해주겠다.
     //위 설명(계속): sizeof(stServer)는 얼마만큼 넣을 것인가?

     stServer.sin_family = AF_INET;
     stServer.sin_addr.s_addr = inet_addr("192.168.1.55");
     stServer.sin_port = htons(9999);

     iLen=sizeof(stServer);
     printf("please write message \n");

     fflush(stdout);
     iRet=read(0, caBuff, 250);
     //위 설명: 0은 읽어들일 곳.
     //위 설명(계속): caBuff는 저장할 곳.
     //위 설명(계속): 250은 최대로 읽어 들을 수 있는 크기.

     sendto(iSock, caBuff, iRet, 0, (struct sockaddr*)&stServer, iLen);
     //위 설명: 구조체와 소켓함수가 sendto에서 사용된다.
     //위 설명(계속): Socket번호를 반환한다. iSock= 네트워크를 사용하겠다.
     //위 설명(계속): caBuff에 보낼 Data를 저장.
     //위 설명(계속): 보낼 Data 크기
     //위 설명(계속): 0 초기화.
     //위 설명(계속): (struct sockaddr*)&stServer 보낼 곳의 주소를 적는다. soc
     //위 설명(계속): iLen 은 구조체의 길이가 필요하다.

     close(iSock);
     return 0;

 }


두번째 작품 (원시적인 채팅 프로그램)

udp.h

 #ifndef __UDP_H__
 #define __UDP_H__

 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <string.h>

 #define BSIZE 250
 #define IP_SERVER "192.168.1.60"
 #define PORT 9999

 #endif //__UDP_H__

client.c

 #include "udp.h"

 int main(void)
 {
     int iSock;//변수를 저장할 공간이 필요하다.
     int iLen;//구조체 길이를 저장하기 위해 사용한다.
     char caBuff[BSIZE];
     int iRet;
     struct sockaddr_in stServer;//접속하거나 네트워크에 사용될 IP, PORT번호가

     iSock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//open과 같은 역할, 네트워

     if(iSock<0)
     {
     printf("can not make a socket \n");
     return 0;
     }

     memset(&stServer, 0, sizeof(stServer));
     //위 설명: memset -> mem은 mem, set은 세팅, 즉. 메모리를 세팅한다는 뜻이?
     //위 설명(계속): &stServer는 메모리
     //위 설명(계속): 0는 초기화 해주겠다.
     //위 설명(계속): sizeof(stServer)는 얼마만큼 넣을 것인가?

     stServer.sin_family = AF_INET;
     stServer.sin_addr.s_addr = inet_addr(IP_SERVER);
     stServer.sin_port = htons(PORT);

     iLen=sizeof(stServer);
     printf("please write message \n");

     fflush(stdout);
     iRet=read(0, caBuff, BSIZE);
     //위 설명: 0은 읽어들일 곳.
     //위 설명(계속): caBuff는 저장할 곳.
     //위 설명(계속): 250은 최대로 읽어 들을 수 있는 크기.

     sendto(iSock, caBuff, iRet, 0, (struct sockaddr*)&stServer, iLen);
     //위 설명: 구조체와 소켓함수가 sendto에서 사용된다.
     //위 설명(계속): Socket번호를 반환한다. iSock= 네트워크를 사용하겠다.
     //위 설명(계속): caBuff에 보낼 Data를 저장.
     //위 설명(계속): 보낼 Data 크기
     //위 설명(계속): 0 초기화.
     //위 설명(계속): (struct sockaddr*)&stServer 보낼 곳의 주소를 적는다. soc
     //위 설명(계속): iLen 은 구조체의 길이가 필요하다.

     close(iSock);
     return 0;

 }

server.c

#include "udp.h"

 int main(void)
 {
     int iSock;//변수를 저장할 공간이 필요하다.
     int iLen;//구조체 길이를 저장하기 위해 사용한다.
     char caBuff[BSIZE];
     int iRet;
     struct sockaddr_in stServer;//접속하거나 네트워크에 사용될 IP, PORT번
     struct sockaddr_in stClient;//접속하거나 네트워크에 사용될 IP, PORT번

     iSock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//open과 같은 역할, 네

     if(iSock<0)
     {
    printf("can not make a socket \n");
     return 0;
     }

     memset(&stServer, 0, sizeof(stServer));
     //위 설명: memset -> mem은 mem, set은 세팅, 즉. 메모리를 세팅한다는 ?
     //위 설명(계속): &stServer는 메모리
     //위 설명(계속): 0는 초기화 해주겠다.
     //위 설명(계속): sizeof(stServer)는 얼마만큼 넣을 것인가?

     stServer.sin_family = AF_INET;
     stServer.sin_addr.s_addr = inet_addr(IP_SERVER);
     stServer.sin_port = htons(PORT);

     iLen=sizeof(stServer);
     //printf("please write message \n");
     //fflush(stdout);
     //iRet=read(0, caBuff, BSIZE);
     //위 설명: 0은 읽어들일 곳.
     //위 설명(계속): caBuff는 저장할 곳.
     //위 설명(계속): 250은 최대로 읽어 들을 수 있는 크기.


     iRet = bind(iSock, (struct sockaddr *) &stServer, iLen);//항구를 건설

     if(iRet<0)
     {
         printf("Bind Error \n", PORT);//들어갈 곳이 없으면(PORT가 사용중?
         close(iSock);
         return;
     }

     iRet=recvfrom(iSock, caBuff, BSIZE, 0, (struct sockaddr*)&stClient, &
     //위 설명: 구조체와 소켓함수가 sendto에서 사용된다.
     //위 설명(계속): Socket번호를 반환한다. iSock= 네트워크를 사용하겠다.
     //위 설명(계속): caBuff에 보낼 Data를 저장.
     //위 설명(계속): 보낼 Data 크기
     //위 설명(계속): 0 초기화.
     //위 설명(계속): (struct sockaddr*)&stServer 보낼 곳의 주소를 적는다.
     //위 설명(계속): iLen 은 구조체의 길이가 필요하다.

     caBuff[iRet]=0;

     printf("[%s] : [%s]\n", inet_ntoa(stClient.sin_addr), caBuff);


     close(iSock);
     return 0;
 }

<출력결과>

<해당 파일>

 udp.h

 client.c

 server.c


3페이지. 패킷이 누락되는 경우, 패킷이 삭제되는 경우, 패킷의 순서가 다른 경우가 생긴다.


4페이지. 패킷 순서를 바꿔서 정해주거나, 패킷이 없어졌을 때는 다시 달라고 한다.


5페이지. Three-way handshake. 설명. 연결지향(확인하는 것.)

왼쪽: 클라이언트(을)  오른쪽: 서버(갑)

1. 클라이언트가 사귀고 싶다고 먼저 이야기함.(임의로 시퀀스 번호를 만든다.)

2. 서버가 알았어 하면.(아크 값(145)는 시퀀스에+1 그리고 시퀀스 값(288)은 임의로 만들어진 시퀀스 값이다. )

3. 오케이하고 대답한다.(시퀀스 값(288)에 +1을 하여 289 값을 서버에게 보낸다. 그래서 서버는 아크 값(289)를 받아야 한다. 289가 아니면 뭔가가 잘못된 것이다.)



728x90