2013-02-20 2 views
1

저는 네트워크 프로그래밍 수업을받는 학생이며 파일 전송을 위해 세 대의 서버에 연결하는 UDP 클라이언트를 작성하고 있습니다. 지금까지 클라이언트가 처음 두 서버와 통신하도록했지만이 세 번째 서버 복사본은 작동하지 않습니다. 그것도 내가 넣은 printf 디버그 문장을 출력하지 않는다. 무슨 일이 일어나고 있는가? 유닉스에 문제가 있습니까? 첫 번째 두 서버는 포트/IP 주소가 변경된이 서버와 정확히 동일하며 완벽하게 작동합니다.내 프로그램이 printf로 아무 것도 출력하지 않는 이유는 무엇입니까?

#include <stdlib.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <stdio.h> 
#include <errno.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <strings.h> 

int main(int argc, char**argv) 
{ 
    printf("i will destroy you"); 
    int o = 1; 
    int sockfd,n; 
    struct sockaddr_in servaddr,cliaddr; 
    socklen_t len; 
    char mesg[1000]; 

    printf("im confused"); 
    sockfd=socket(AF_INET,SOCK_DGRAM,0); 

    bzero(&servaddr,sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr=inet_addr("127.0.0.1"); 
    servaddr.sin_port=htons(3454); 
    bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); 
    printf("yo wtf"); 

    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &o, sizeof(o)) < 0){ 
     perror("setsockopt failed"); 
     exit(0); 
    } 
    printf("here1"); 
    while(1) 
    { 
     len = sizeof(cliaddr); 
     printf("here"); 
     n = recvfrom(sockfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&len); 
     sendto(sockfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr)); 
     printf("-------------------------------------------------------\n"); 
     mesg[n] = 0; 
     printf("Received the following:\n"); 
     printf("%s",mesg); 
     printf("-------------------------------------------------------\n"); 
    } 
} 
+1

처음에는'printf' 문자열의 끝에'\ n'을 넣으십시오. 그들이 완충 되었기 때문에 당신이 그들을 보지 못할 수도 있습니다. – paxdiablo

+0

출력 메시지를 표시하려면 줄 바꿈으로 끝나야합니다. 처음 두 개의'printf()'문은 개행으로 끝나지 않습니다; 그것들의 출력은 개행을 출력하거나'fflush (stdout)'을 사용할 때까지 나타나지 않을 것입니다 (또는'stdout'을 위해'FILE * '에서 버퍼에 더 이상 들어 가지 않는 한 줄로 많은 양의 데이터를 출력합니다) . –

+1

'printf (3)'출력은 보통 버퍼링되며, 버퍼 (큰)가 채워질 때만 쓰여집니다. 'fflush (stdout)'을 사용하여 강제로 출력 할 수 있습니다. – vonbrand

답변

1

에로 stderr를 사용 printf("i will destroy you") 내지 printf("i will destroy you\n"). 또는 setbuf()을 참조하십시오. 또는 fflush(stdout)을 사용하십시오.

+0

지금 인쇄합니다. 개행 문자가 필요한 이유는 무엇입니까? 때로는 내 다른 프로그램에서 나는 그것을 밖으로두고 있지만 여전히 어딘가에 터미널에서 프롬프트 전에 나타납니다. –

+0

'stdin'을 사용하는'scanf' 등은'stdout'에 묶여 있기 때문에 프롬프트가 왜곡되지 않습니다. –

+0

하나의 사소한 점 :'mesg [n] = 0;'줄이 올바르지 않습니다. 'n'은 아마도'1000'이 될 수 있습니다. 그래서 nul은 배열의 끝에지나 가게됩니다. (또는 오류가 있는지 확인하고 싶다면 'n'은 -1이 될 수 있습니다.) –

0

stdout을 플러시하지 않았습니다.

또는, 당신은 아마 예를 들어, 변경해야

fprintf(stderr,"My message\n"); 
관련 문제