2013-02-20 109 views
1

我是網絡編程課的學生,我正在寫一個UDP客戶端,連接到三臺服務器來完成文件傳輸。到目前爲止,我已經讓客戶端與前兩臺服務器通信,但服務器的第三個副本不工作。它甚至沒有打印出我輸入的printf調試語句。發生了什麼? Unix有什麼問題嗎?前兩臺服務器與此端口/ 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

首先,將'\ n'放在'printf'字符串的末尾。你可能沒有看到它們,因爲它們被緩衝了。 – paxdiablo 2013-02-20 03:45:22

+0

如果您希望輸出消息出現,請確保它們以換行符結束。你的前兩個'printf()'語句不會以換行符結束;它們的輸出在你輸出一個換行符或者使用'fflush(stdout)'(或者在一行中打印出不再符合'stdout'的FILE *'的緩衝區中的數據) 。 – 2013-02-20 03:45:59

+1

'printf(3)'輸出通常是緩衝的,只有當緩衝區(大量)填滿時纔會寫出。你可以用'fflush(stdout)'強制輸出。 – vonbrand 2013-02-20 03:46:44

回答

1

使用stderr爲您可能需要例如,改變printf("i will destroy you")printf("i will destroy you\n")。或見setbuf()。或使用fflush(stdout)

+0

它現在打印。爲什麼需要換行符?有時在我的其他程序中,我放棄它,但它仍然顯示在終端提示符之前的某處。 – 2013-02-20 03:49:28

+0

'scanf'等,使用'stdin',綁定到'stdout',這樣提示不會出現亂碼。 – 2013-02-20 03:52:43

+0

一個小點:'mesg [n] = 0;'不太正確。 'n'可能是'1000',所以nul被放在數組的末尾。 (或者,當然,'n'可以是-1,如果你想檢查錯誤。) – 2013-02-20 03:54:25

0

你不沖洗stdout

另外,在

fprintf(stderr,"My message\n"); 
相關問題