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; }
<출력결과>
<해당 파일>
3페이지. 패킷이 누락되는 경우, 패킷이 삭제되는 경우, 패킷의 순서가 다른 경우가 생긴다.
4페이지. 패킷 순서를 바꿔서 정해주거나, 패킷이 없어졌을 때는 다시 달라고 한다.
5페이지. Three-way handshake. 설명. 연결지향(확인하는 것.)
왼쪽: 클라이언트(을) 오른쪽: 서버(갑)
1. 클라이언트가 사귀고 싶다고 먼저 이야기함.(임의로 시퀀스 번호를 만든다.)
2. 서버가 알았어 하면.(아크 값(145)는 시퀀스에+1 그리고 시퀀스 값(288)은 임의로 만들어진 시퀀스 값이다. )
3. 오케이하고 대답한다.(시퀀스 값(288)에 +1을 하여 289 값을 서버에게 보낸다. 그래서 서버는 아크 값(289)를 받아야 한다. 289가 아니면 뭔가가 잘못된 것이다.)
728x90
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
20160420_장진웅_업무일지_공장내Network_일대일통신5_멀티채팅 (1) | 2016.04.20 |
---|---|
20160419_장진웅_업무일지_공장내Network_일대일통신4_양방향 채팅 (0) | 2016.04.20 |
20160418_장진웅_업무일지_공장내Network_일대일통신3 (0) | 2016.04.18 |
버츄얼박스 com 개체를 만들수 없습니다 오류 (1) | 2016.04.17 |
20160414_장진웅_업무일지_공장내Network_일대일통신(메뉴 추가한 도서관 프로그램) (0) | 2016.04.16 |
2016-04-07-조재찬_업무일지_구조체 및 함수 (0) | 2016.04.15 |
2016-04-06-조재찬_업무일지_포인터 및 함수 (0) | 2016.04.15 |
2016-04-14_조재찬_업무일지_네트워크:소켓 (0) | 2016.04.15 |