-
20140626 (select, 1:1 채팅)부산IT학원/스마트컨트롤러 2014. 6. 26. 09:22
89일차
--------------
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 번호도 추가로
실행화면
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140702 (ARM Register Summary, LED 켜기) (0) 2014.07.02 20140701 (ARM Cygwin, arm-gcc) (0) 2014.07.01 20140625 (메시지 큐 우선순위, 공유 메모리) (0) 2014.06.25 20140624 (레코드 잠금, 파이프 통신, 메시지 큐) (0) 2014.06.24 20140623 (pthread, 레코드 잠금) (0) 2014.06.23