2012-12-16 3 views
1

나는 클라이언트 서버 응용 프로그램을 작성 중이며 여러 클라이언트 소켓과 stdin 사이의 폴링을 사용하여 명령을 삽입 할 수 있습니다 (예 : stop 서버). 코드를 쉽게하기 위해C - 소켓과 표준 사이의 멀티 플렉스를 사용하여 서버 - 서버

struct pollfd pfd[NSERVER]; //defined as 10 
pfd[0].fd = fileno(stdin); 
pfd[0].events = POLLIN; 
pfd[1].fd = socktfd; //server bind, listen socket 
pfd[1].events = POLLIN; 
struct sockaddr_storage remoteaddr; // client address 
socklen_t addrlen; 
char remoteIP[INET6_ADDRSTRLEN]; 
addrlen = sizeof remoteaddr; 
char buf[1024];  // buffer 
int pos=2; 

    while(poll(pfd,1,0) >= 0) 
{ 
    if(pfd[0].revents & POLLIN) { //stdin 
      //process input and perform command 
     } 
    if(pfd[1].revents & POLLIN) { 
     /* new connection */ 
     int connsockfd = accept(socktfd, (struct sockaddr *)&remoteaddr,&addrlen); 


      pfd[pos].fd=connsockfd; 
     } 
int i=2; 
//Loop through the fd in pfd for events 
    while (i<=NSERVER) 
    { 
     if (pfd[i].revents & POLLIN) { 
    int c=recv(pfd[i].fd, buf, sizeof buf, 0); 
      if(c<=0) { 
     if (c==0) 
    { 
       /* Client closed socket */ 
      close(pfd[i].fd); 
        }} 


    else 
      {//Client sent some data 
      c=send(pfd[i].fd,sbuff,z,0); 
      if (c<=0) 
     { 
      Error; 
     } 
     free(sbuff); 
     } 
     } 
     i++; 
     } 
     } 

내가 RECV 내부의 코드를 제거하고 전송했습니다 그러나 나는 그것이 내가 그것을 예상대로 작동하지 않는 것, 내 코드의 구조 (이하 "논리") 올바른 생각 읽다. 동작에 실패 (연결이 끊어 지거나 연결을 허용하지 않음 또는 표준 입력에서 반응 함).

참고 : select over poll을 사용하는 것이 좋으므로 선택하지 않는 것이 좋습니다 :-).

미리 도움을 청하십시오.

+0

소켓이 차단되었거나 차단되지 않았습니까? 그것은 어디서 멈 춥니 까? – ninjalj

+0

비 블로킹이며 처음부터 중단됩니다. stdin에서 입력을 입력 할 수 있지만 처리되지 않았습니다. 소켓과 동일 –

+0

_exactly_는 멈 춥니 다? 'strace' 또는 이와 동등한 것에서 실행하십시오. – ninjalj

답변

3
  1. pfd[i].fd = -1을 모두 설정해야합니다. 따라서 처음에는 poll()에 의해 무시됩니다.
  2. poll(pfd, 1, 0)이 잘못되어 적어도 poll(pfd, 2, 0) 또는 poll(pfd, NSERVER, 0)이어야합니다.
  3. while(i<=NSERVER)해야 while(i<NSERVER)

여러분의 프로그램은 아마 달려 있기 때문에 당신이 속 밀도 초기화 .FD 및 .revents에 대한 임의의 값을는 containes, 그래서 보내려고하지 않는 배열() 또는 RECV을 반복 (임의의 FD에서 차단 될 수도 있음). i<NSERVER 루프에서 if(pdf[i].fd < 0) {i++; continue;}을 수행하십시오.

새로 허용 된 소켓에 pfd[pos].events = POLLIN도 설정하지 마십시오. 거의 모든 시간에 트리거되기 때문에 보낼 항목이없는 한 POLLOUT을 설정하지 마십시오.