2012-07-12 2 views
1

Прошу прощения, если заголовок вводит в заблуждение. Я не могу думать о лучшей. Вот некоторые простые программы сокета, что у меня есть:Опрос TCP socket idle listen

#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; 
} 

Если я выполняю этот код с номером порта, а затем телнет на этот номер порта, сервер слушает, но как только я отправить мое первое сообщение, соединение завершается. Я хочу, чтобы сервер продолжал слушать и отправлять подтверждение обратно столько раз, сколько я отправляю сообщение из telnet. Как это сделать?

Заранее благодарен!

+0

и я не уверен, как код компилируется как заданный с этим оператором 'continue' и без цикла. –

+0

Это была глупая ошибка с моей стороны. Я пытался что-то сделать, прежде чем публиковать его. Забыл удалить его. Искренние извинения. –

+0

Похоже, вы были на правильном пути, потому что 'continue' требует цикла, и цикл - это то, что вы хотите. –

ответ

3

continue любопытно посторонний и заставляет компиляцию сломаться. (Теперь это исправлено в вашем редактировании.) Но вам не хватает цикла for. И вы должны добавить чек, если read возвращает 0.

 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

Я не думаю, что продолжение влияет на компиляцию, но может иметь некоторые проблемы во время выполнения. Однако это кажется посторонним. Да, для продолжения чтения из сокета необходим цикл. В противном случае этот код просто закрывает сокет после чтения и записи. – gonzobrains

+0

@ gonzobrains: У меня есть ошибка: продолжить оператор не в цикле. С уважением – jxh

+0

Спасибо! Думаю, это был не очень умный вопрос: P –