클라이언트
1. 소켓생성
Sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
서버와 마찬가지로 stream으로 설정한다. 데이터를 하나씩 확인하면서
받을 때 사용.
2.구조체 설정
MEMSET = 메모리 셋팅
1바이트씩 특정한 메모리를 다 채워 넣는다.
MEMSET(&echoServAddr, 0, sizeof(echoServAddr));
주소(첫 번째인자)에 echoServAddr주소(세 번째 인자) 크기만큼 0을 채워 넣는다. 0을 넣어서 초기화 하는 부분.
echoServAddr.sin_family= AF_INET;
패밀리 설정.
echoServAddr.sin_addr.s_addr= inet_addr(serIP);//서버 ip주소 넣는 부분.
echoServAddr.sin_port= htons(9999);// 포트번호 설정. 9999로 설정함.
3.connect()함수
iRet=connect(sock, (struct addr*)&echoServAddr, sizeof(echoServAddr ));
1. 첫 번째 인자는 생성한 소켓, 소켓번호,
2. 두 번째 인자는 서버의 주소.
3. 크기
클라이언트 Connect함수= 서버의 accept함수.,
Read()함수에서 키보드로부터 입력한 값을 버퍼에서 읽어 들인다.
Write()함수에서 버퍼에 있는 문자를 써서 소켓에 보낸다. 그러면,
서버에서 문자를 받는다.(클라이언트가 데이터를 전송하는 부분)
다시 read()함수에서 소켓에 있는(서버가 다시 데이터를 다시 전송한) 버퍼를 읽어들여서,
Printf()함수로 글자를 화면에 띄운다.
실행결과
서버에서의 화면(클라이언트에서 보낸 문자가 화면에 찍힌다.)
클라이언트에서의 화면
“songsihyuk”이라는 문자를 입력하고 서버에 보낸뒤, 다시 그 문자데이터를
클라이언트가 받아낸다.
이제는 memset()함수를 알아보자
첫 번째 인자는 void *vp. void *를 자료형으로 선언한 이유는 echoServAddr은 구조체, 기타 ...등은 다른 자료형을 가지고 있으므로, 이 모든 자료형을 가르킬 수 있는 void *로 선언한다.
두 번째 인자 uCpad는 1바이트씩 데이터를 가르키므로 unsigned char로 자료형을 선택
*(unsigned char *)vp= uCpad;
vp는 주소이다. 그래서 캐스팅다음, 바로 *를 붙여서 상수로 인식시킨다. 이 부분은 uCpad가 데이터를 넣는부분.
세 번째 인자 uIsize는 전체 데이터의 크기이다. 여기서는 5이므로 전체 길이는 다음과 같다.
|
|
|
|
|
--uIsize; 감소한다.
그리고 vp(uCpad)가 가르키는 곳을 이동해야 하므로 주소인 vp에 1을 더하면 된다.
그러나 역시 1바이트씩 이동하고 void형 포인터이기 때문에 캐스팅이 절대적으로 필요
(unsigned char *)형으로 캐스팅해준다. 그러면, 다음 1바이트 이동한만큼의 다음주소를 가르키게 된다.
이로서 memset()함수는 완성이 된다.
그리고 bzero()함수가 memset()함수를 호출하여 실행한다. 실제로 오늘은 memset()함수만 만들고 이것을 컴파일 하지 않았다.
'네트워크 > vmware 실습' 카테고리의 다른 글
6월 20일 VM을 이용한 1:다수 채팅 프로그램 (0) | 2013.06.20 |
---|---|
6월 19일 1:2채팅 프로그램(수정중) (0) | 2013.06.19 |
6월 18일 vi로 하는 1:1채팅프로그램 (0) | 2013.06.18 |
6월 14일 vm 기본 telnet과 채팅하기 (0) | 2013.06.14 |
6월 12일 리눅스 기본1 (0) | 2013.06.12 |