2009-10-30 1 views
1

몇 가지 연결을 추적하고 사용 가능한 데이터를 recv'ing 꽤 기본적인 TCP 서버가 있습니다. 그러나, 프로그램 자체에서 이벤트를 인위적으로 트리거하고 싶습니다. 따라서 처럼 내 컴퓨터의 TCP 서버 데이터를 보낼 수 있습니다.은 sock1 또는 sock2에서 왔지만 실제로는 다른 곳에서 온 것입니다. 가능한가, 아니면 전혀 명확한가?poll()을 사용하여 간단한 TCP 서버를 실행하면 어떻게 "인위적으로"이벤트를 트리거 할 수 있습니까?

struct pollfd fds[2]; 
fds[0].fd = sock1; 
fds[1].fd = sock2; 

while (true) { 
    int res = poll(fds, 2, timeout); 

    if ((fds[0].revents & POLLIN)){ 
    //ready to recv data from sock1 
    } 
    if ((fds[1].revents & POLLIN)){ 
    //ready to recv data from sock2 
    } 
} 
+0

다른 소켓으로 localhost에 연결하지 않고 sock1 또는 sock2의 대기열에 데이터를 저장 하시겠습니까? –

+0

정확히, 새로운 소켓으로 localhost에 연결하고 싶지 않습니다. 실제로는 기존 소켓 중 하나를 "스푸핑 (spoof)"하고 싶습니다. –

답변

4

연결된 소켓 쌍 (socketpair (2) 참조)을 만들고 폴링 루프의 소켓 중 하나에서 이벤트를 기다립니다. 폴링 쓰레드를 깨울 때 다른 소켓에 1 바이트를 씁니다. 폴링 루프가 깨어나면 바이트를 읽고 필요한 모든 작업을 수행 한 다음 계속합니다.

+0

write() 함수를 사용하여 버퍼에 기록한 다음 "이 값을 가진 1 바이트 메시지가 수신되면 이것을 수행하십시오"라는 if 문을 작성 하시겠습니까? 왜 socketpair가 필요한가? 내가 기다리고있는 소켓의 버퍼에 직접 쓸 수없는 이유가 있을까? –

+1

기다리고있는 소켓 버퍼에 쓸 수 없기 때문에 socketpair()가 필요합니다. 따라서 프로그램의 다른 부분에 폴 루프를 발생시키는 방법을 제공하려면 소켓 쌍이 필요합니다. 설문 조사 루프는이 방법으로 깨어났다는 사실을 알아 차리고 원하는대로 수행해야합니다. 다음 질문은 내부 데이터 구조가 필요하거나 소켓 페어의 쓰기 끝 부분에 완전한 메시지를 쓸 수 있다는 것입니다. 완전한 메시지를 작성하고 여러 작성자가 메시지를 손상시키는 비 원자 적 쓰기에주의해야합니다. – janm

+0

"시들다"-> "어느 쪽이나" – janm

0

이것은 폴링 루프가 아마도 kill -USR1과 같은 다른 외부 신호를 트래핑 할 수 있도록 폴링 방법을 추상화해야한다는 디자인상의 질문과 같습니다.

포트 트래픽을 실제로 트리거하려면 netcat을 사용하여 데이터를 소켓에 보내고 싶을 것입니다.

0

나는이 같은 것을 고려할 것 :

  • for(;;)while(true)보다 더 관용적 C이며, 필요하지 않습니다
    • 가 잊지 마세요

      가 초기화 당신의 events 필드 :

      struct pollfd fds[2]; 
      fds[0].fd = sock1; 
      fds[0].events = POLLIN; 
      fds[1].fd = sock2; 
      fds[1].events = POLLIN; 
      
      for (;;) { 
          int result = poll(fds, 2, timeout); 
      
          if (result) { 
          if ((fds[0].revents & POLLIN)){ 
           /* Process data from sock1. */ 
          } 
          if ((fds[1].revents & POLLIN)){ 
           /* Process data from sock2. */ 
          } 
          } else { 
          /* Do anything else you like, including 
           processing data that wasn't from a 
           real socket. */ 
          } 
      } 
      

      노트 true 정의 될

  • +0

    질문에 어떻게 대답합니까? – qrdl

    +0

    나는 poll() 함수를 외부 적으로 트리거하는 방법을 원했지만, 코드가 시간 초과 될 때까지 기다렸다가 다른 것을 얻을 수있는 방법을 제공한다고 생각합니다. –

    관련 문제