2011-11-29 2 views
1

나는 TCP 소켓을 통해 일종의 채팅을 시도한다. 서버 측은 PHP로 구현되어 잘 작동해야합니다.양방향 소켓 (non-blocking) with

아니, 난이 클라이언트 측에서 문제가 발생했습니다 (C에서 구현 [C99]) :

내가 서버에서 "새로운 바이트"에 대한 (읽기) 들으려면 내가 또한 싶습니다

사용자가 새로운 데이터를 입력 할 때마다 서버에 "몇 바이트"를 보내도록 (쓰기)합니다.

이제 질문 :-> 들어오는 트래픽 (수신)을 수신하고 어떻게 새 바이트가 서버에 전송되는지 확인할 수있는 콜백을 1 초마다 호출 할 수 있습니까? select (system call)을 사용해야한다는 것을 알고 있지만 timeout 등을 처리하는 방법에 대한 아이디어가 없기 때문에 select도 특정 시간 동안 차단됩니다.

감사합니다.

+0

스레드 사용을 고려 했습니까? –

+0

스레드가 문제를 해결할 수 있습니다. –

답변

1

여기에는 select이라는 기능이 있습니다. 읽을 소켓에 새로운 입력이 있는지 확인할 수 있습니다. 또한 시간 초과가 있으므로 타이머에도 사용할 수 있습니다.

하나의 양식 또는 모든 주요 운영 체제에 존재합니다. socket select <your operating system> example에 대한 Google 검색을 수행하면 보트 검색 결과가 표시됩니다.


select의 마지막 인수가 시간 초과에 사용됩니다. 이것은 struct timeval에 대한 포인터로 타임 아웃을 설정할 필드가 들어있는 구조체입니다.

이 포인터가 NULL으로 전달되면 시간 제한이없고 select이 무기한 차단 될 수 있습니다.

당신은 (이하 백만이어야 함) 초 및 마이크로의 수에 tv_usec 필드로 timeval 구조의 tv_sec 필드를 설정해야합니다, 시간 제한을 설정합니다. 이 입력란을 0으로 설정하여 시간 초과 (예 : 빠른 설문 조사)를 0으로 설정할 수 있습니다.

select이 0을 반환하면 시간 초과가 발생했습니다.

예 1.5 초 타임 아웃 :

for (;;) 
{ 
    fd_set readset; 
    int maxfd; 

    /* Initialize and set `readset` and `maxfd` */ 

    struct timeval tv; 
    tv.tv_sec = 1; 
    tv.tv_usec = 500000; 

    int res = select(maxfd + 1, &readset, NULL, NULL, &tv); 

    if (res == -1) 
     perror("select"); /* Error */ 
    else if (res == 0) 
    { 
     /* Timeout, do something */ 
    } 
    else 
    { 
     /* A socket in `readset` is readable */ 
    } 
} 

타임 아웃 전에select 복귀하면 timeval 구조는 제한의 남은 시간을 포함하도록 수정된다.

+0

감사합니다. 나는 select를 사용해야한다는 것을 안다. 하지만 어떻게 타임 아웃을 설정합니까? 블록도 선택 .... 어떤 아이디어 예? 내가 구글 검색에 의해 C에 대한 예제를 찾을 수 없습니다. –

+0

해결책을 찾았습니다! http://rhoden.id.au/doc/sockets.HTML –

+0

당신은 또한 링크가 끊어진 발견했습니다! – g33kz0r

0

필요에 따라 설정 timeout 매개 변수의 select 시스템 호출을 사용합니다. Beej's guide은 여전히 ​​많은 예제 코드가 포함 된 좋은 자료입니다.

0

전화 번호 system을 사용하십시오. this도 유용 할 수 있습니다.