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

20140626양태영 수업보고서(출석번호 16번)

by 알 수 없는 사용자 2014. 6. 26.
728x90
반응형










--------------

select 함수

--------------



--- select


select 는 상태가 변경되는 파일 기술자들의 숫자를 기다린다.


#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>


int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);


n : 감시하려는 파일 기술자들의 최고 큰 숫자 + 1

readfds : 읽기 감시 구조체

writefds : 쓰기 감시 구조체

exceptfds : 에러 감시 구조체

timeout : 감시 대기 시간. NULL값 줄 시 감시 될 때까지 무한대기



리턴값

       성공시

파일 기술자 집합에  포함된  기술자들의  숫자를  반환,  어떠한  일이  일어나기  전에 타임아웃이  발생하면  0을  반환한다.


 실패시

-1 반환, errno 는 적당한 값으로 설정된다. 집합들과 timeout 은 정의가 안되며, 그래서 에러후 이것들의 내용에 의지할수 없다.









--- fd_set 구조체









--- timeval 구조체


구조체 내에 변수의 값 만큼 대기한다.


struct timeval
{
    long tv_sec; /* seconds */
    long tv_usec; /* microseconds */
}











--- FD_CLR


fdset 중 소켓 fd에 해당하는 비트를 0으로 한다.


#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>


FD_CLR(int fd, fd_set *set);


fd : 비트를 0으로 바꿀 파일 디스크립터

set : 목표로 하는 fd_set 구조체








--- FD_ZERO


fdset 의 모든 비트를 지운다.


#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>


FD_ZERO(fd_set *fdset);


fdset : 모든 비트를 0으로 set 시킬 fd_set 구조체








--- FD_SET


fdset 중 소켓 fd에 해당하는 비트를 1로 한다.


#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>


FD_SET(int fd, fd_set *fdset);


fd : 비트를 1로 바꿀 파일 디스크립터

fdset : 목표로 하는 fd_set 구조체









--- FD_ISSET


fdset 중 소켓 fd에 해당하는 비트가 세트되어 있으면 양수값인 fd를 리턴한다.


#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>


FD_ISSET(int fd, fd_set *fdset);


fd : 비트를 알아볼 파일 디스크립터

fdset : 알아볼 fd_set 구조체












--- select 함수를 이용한 server와 client 1:1 채팅 프로그램



client 소스






server 소스








결과

















--- server 에서 client 정보 보기


1:1 채팅을 하는데 client의 정보를 확인하기


우선 예전에 ip번호를 할당할 때

int inet_aton(const char *cp, struct in_addr *inp);

이 함수로 "192.168.***.***" 이 문자열을 "C0A8****"란 16진수로 바꾸었다.

이번엔 반대로 client에서 들어온 정보에서 16진수를 문자열로 바꾸어 보기로 한다.
char *inet_ntoa(struct in_addr in); 이 함수가 우리가 보기 좋은? IP 번호로 바꾸어 준다.



( in_addr 구조체 찾은 방법)

$grep -R "struct in_addr" /usr/include/linux/




이제 server 소스를 수정하기로 한다.






실행화면











이제 client의 port 번호도 추가로




실행화면




728x90