ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 번호도 추가로




    실행화면





Designed by Tistory.