2010-11-29 6 views
1

У меня есть простой сервер сокетов здесь, и у меня, кажется, должен быть простой вопрос. Прежде чем сокет примет подключения, я хочу, чтобы он распечатывал идентификатор своего процесса. Но он ничего не печатает, независимо от того, что это такое, пока не будет соединение. Сначала я думал, что это произошло потому, что призыв принять блокировал печать как-то так я попытался добавить это в разных местах:Linux-сервер сокетов printf проблема

int fdflags = fcntl(sockfd, F_GETFL, 0); 
fcntl(sockfd, F_SETFL, fdflags | O_NONBLOCK); 

Но это не имело никакого влияния на код, кроме делая принимать неблокирующем. Поэтому я надеялся, что кто-то здесь сможет рассказать мне, что происходит. Сервер работает иначе. Я также отправлю код клиента.

server.c:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <signal.h> 
#include <fcntl.h> 

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

static void SIGCHLD_Handler(int sig) { 
    waitpid(-1, NULL, WNOHANG); 
} 

int main(int argc, char *argv[]) { 

    int num,sockfd, newsockfd, portno, clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    struct sigaction sigact; 

    sigact.sa_handler = SIGCHLD_Handler; 
    if (sigaction(SIGCHLD, &sigact, 0)) error("sighandle def"); 

    int n, childPid; 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1); 
    } 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) error("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = atoi(argv[1]); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); 
    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 
    printf("I am the Knock Knock server and my pid number is %d\n", getpid()); 

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

     bzero(buffer,256); 

     childPid = fork(); 
     if (childPid < 0) error ("ERROR on fork"); 
     else if (childPid == 0) { 
      close(sockfd); 

      while(1) { 
       // read an int from the client that says how big the message will be 
       n = read(newsockfd, &num, sizeof(int)); 
       // if client sends just Enter, then quit 
       if(num==2) break; 

       // read num bytes from client 
       n = read(newsockfd,buffer,num); 
       if (n < 0) error("ERROR reading from socket"); 

       // display the message from the client 
       printf("Here is the message: %s\n",buffer); 
       num=19; 

       // Tell the client to expect 19 bytes 
       n = write(newsockfd, &num, sizeof(int)); 
       // Send client 19 bytes 
       n = write(newsockfd,"I got your message",num); 
       if (n < 0) error("ERROR writing to socket"); 
      } 

      exit(0); 
     } else close(newsockfd); 
    } 
    return 0; 
} 

client.c:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <string.h> 

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

int main(int argc, char *argv[]) { 
    int num, sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    char buffer[256]; 
    if (argc < 3) { 
     fprintf(stderr,"usage %s hostname port\n", argv[0]); 
     exit(0); 
    } 
    portno = atoi(argv[2]); 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    server = gethostbyname(argv[1]); 
    if (server == NULL) { 
     fprintf(stderr,"ERROR, no such host\n"); 
     exit(0); 
    } 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr, 
     server->h_length); 
    serv_addr.sin_port = htons(portno); 
    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
     error("ERROR connecting"); 

    do{ 
     printf("Please enter the message: "); 
     bzero(buffer,256); 
     fgets(buffer,255,stdin); 

     num = strlen(buffer)+1; 
     // send server an int that says how long the coming message will be 
     n = write(sockfd, &num, sizeof(int)); 
     // num=2 when user just presses Enter. No message = quit 
     if(num==2) break; 

     // send server the message (num bytes long) 
     n = write(sockfd,buffer,num); 
     if (n < 0) 
      error("ERROR writing to socket"); 
     bzero(buffer,256); 

     // read how many bytes are coming from the server 
     n = read(sockfd, &num, sizeof(int)); 
     // read num bytes from the server 
     n = read(sockfd,buffer,num); 
     if (n < 0) 
      error("ERROR reading from socket"); 
     // display the message from the server 
     printf("%s\n",buffer); 
    }while(1); 

    return 0; 
} 
+0

Если вы печатаете f, прежде чем выполнять прослушивание, есть ли у вас такая же проблема? – Cratylus 2010-11-29 07:12:46

ответ

0

Пробовали ли вы некоторые из них:

pid_t pid = getpid(); 

и попытаться использовать GDB для печати PID стоимость? Тем не менее, ваш pid должен печатать. Что делать, если вы попробуете:

printf("pid = %ld\n", getpid()); 
+0

`% ld` почти наверняка неправильный формат для` pid_t`. Я никогда не видел платформы, где это было чем-то вроде «int» после промо-акций по умолчанию (а иногда и «коротких» раньше). – 2010-11-29 14:00:39

+0

@R. от человека 2 wait: printf («Child PID% ld \ n», (long) getpid()); – Aif 2010-11-29 19:02:11

0

принять() блоки, но это не мешает printf(), и сделать его неблокирующим не поможет, и уничтожит правильную работу вашей программы, если вы действительно не знаете, что делаете с неблокирующим сетевым кодом. Это должна быть проблема с буферизацией: fflush (stout) должен ее исправить.

Смежные вопросы