2012-07-12 4 views
1

제목이 오해의 여지가 있으면 죄송합니다. 나는 더 나은 것을 정말로 생각할 수 없다. 여기에 내가 가진 몇 가지 간단한 소켓 프로그램입니다 : 내가 포트 번호로이 코드를 실행 한 다음 해당 포트 번호에 텔넷 경우, 서버는하지만 최대한 빨리 내 첫 번째 메시지를 전송로에 수신Poll TCP 소켓 유휴 수신

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <sys/poll.h> 
#include <iostream> 

#define BACKLOG 10 

void error(const char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 


int main(int argc, char *argv[]) 
{ 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1); 
    } 


    int sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 


    struct sockaddr_in serv_addr; 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    int portno = atoi(argv[1]); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 

    auto bindsuccess = bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); 

    if (bindsuccess < 0) 
     error("ERROR on binding"); 

    struct pollfd newPollFD[1]; 
    newPollFD[0].fd = sockfd; 
    newPollFD[0].events = POLLIN; 

    char buffer[256]; 
    bzero(buffer,256); 

    listen(sockfd, BACKLOG); 

    struct sockaddr_in cli_addr; 
    socklen_t clilen = sizeof(cli_addr); 

    int newsockfd; 

    int rv = poll(newPollFD, 1, -1); 

    if (rv == -1) { 
     error("Error occured in Poll"); 
    } 
    else { 
     if (newPollFD[0].revents & POLLIN){ 

      newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 
      if (newsockfd < 0) 
       error("ERROR on accept"); 

      int rwsuccess; 

      rwsuccess = read(newsockfd,buffer,255); 
      if (rwsuccess < 0) 
       error("ERROR reading from socket"); 

      printf("Here is the message: %s\n",buffer); 

      rwsuccess = write(newsockfd,"I got your message \n",18); 

      if (rwsuccess < 0) 
       error("ERROR writing to socket"); 
     } 
    } 

    close(newsockfd); 
    close(sockfd); 
    return 0; 
} 

는, 연결이 종료됩니다. 나는 끊임없이 청취하고 텔넷에서 메시지를 보내는만큼 여러 번 응답을 보내길 원합니다. 어떻게해야합니까?

미리 감사드립니다.

+0

그리고 코드가 어떻게'continue' 문과 루프없이 주어진대로 컴파일되는지는 잘 모르겠습니다. –

+0

그건 내 멍청한 실수 였어. 나는 그것을 게시하기 전에 무언가를 시도하고 있었다. 그것을 잊어 버렸습니다. 정중 한 사과. –

+0

'continue'는 루프를 필요로하고 루프는 당신이 원하는 것이기 때문에 여러분이 올바른 길을 가고있는 것처럼 들립니다. –

답변

3

continue은 기이하게 관련이 없으므로 컴파일이 중단됩니다. (편집시 수정되었습니다.) 그러나 for 루프가 누락되었습니다. read0을 반환하면 수표를 추가해야합니다.

 for (;;) { 
      int rwsuccess; 

      rwsuccess = read(newsockfd,buffer,255); 
      if (rwsuccess < 0) 
       error("ERROR reading from socket"); 
      if (rwsuccess == 0) break; 

      printf("Here is the message: %s\n",buffer); 

      rwsuccess = write(newsockfd,"I got your message \n",18); 

      if (rwsuccess < 0) 
       error("ERROR writing to socket"); 
     } 
+0

나는 continue가 컴파일에 영향을 미치지 않는다고 생각하지만 런타임 문제가있을 수 있습니다. 그것은 관계없는 것처럼 보입니다. 예, 소켓에서 계속 읽으려면 루프가 필요합니다. 그렇지 않으면 코드는 하나의 읽기 및 쓰기 후에 소켓을 닫습니다. – gonzobrains

+0

@ gonzobrains : 오류가 발생했습니다 : 루프 내에서 명령문을 계속 실행하지 마십시오. 감사합니다 – jxh

+0

감사합니다! 나는 그것이 매우 똑똑한 질문이 아니었을 것이라고 생각한다 : P –