2017-11-29 6 views
0

私はcとjavaのソケットプログラミングに関して、UDPとTCPを使ってプロジェクトを進めています。私のUDPサーバーはJavaで、私のUDPクライアントはCです。recvfrom()を呼び出した後、printfやfprintfなどのメソッドは実際にすべてを出力しないという問題が発生しました。私もfflushを試みました。CでのUDPソケットプログラミング、recvfrom()の呼び出し後にprintfが動作しない?

int main(int argc, char **argv) { 
    int sockfd, portno, n; 
    int serverlen; 
    struct sockaddr_in serveraddr; 
    struct hostent *server; 
    char *hostname; 
    char buf[BUFSIZE]; 
    int GID = 9; 

/* check command line arguments and extract port numbers */ 
    if (argc != 4) { 
    fprintf(stderr,"usage: %s <hostname> <port> <myport>\n", argv[0]); 
    exit(0); 
    } 
    hostname = argv[1]; 
    int serverPort = atoi(argv[2]);             
    int myPort = atoi(argv[3]); 
    int portRange = (5 * GID) + 10010; 
    if (myPort < portRange || myPort > portRange + 4) { 
    fprintf(stderr, "Invalid Port range\n"); 
    exit(1); 
    } 

/* socket: create the socket */ 
    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if (sockfd < 0) 
    error("ERROR opening socket\n"); 

/* gethostbyname: get the server's DNS entry */ 
    server = gethostbyname(hostname); 
    if (server == NULL) { 
    fprintf(stderr,"ERROR, no such host as %s\n", hostname); 
    exit(0); 
    } 

/* build the server's Internet address */ 
    bzero((char *) &serveraddr, sizeof(serveraddr)); 
    serveraddr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, 
    (char *)&serveraddr.sin_addr.s_addr, server->h_length); 
    serveraddr.sin_port = htons(serverPort); 

/* create a message */ 
    bzero(buf, BUFSIZE); 
    buf[0] = 74; 
    buf[1] = 111; 
    buf[2] = 121; 
    buf[3] = 33; 
    buf[4] = (myPort >> 8); 
    buf[5] = (myPort & 0xFF); 
    buf[6] = GID; 

/* send the message to the server */ 
    serverlen = sizeof(serveraddr); 
    n = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&serveraddr, 
    serverlen); 
    if (n < 0) 
    error("ERROR in sendto\n"); 

    bzero(buf, BUFSIZE); 

/* print the server's reply if buf[6] != 0*/ 
    n = recvfrom(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&serveraddr, 
     &serverlen); 
    //ERROR OCCURS AFTER RECEIVING 

    if (n < 0) 
    error("ERROR in recvfrom\n"); 
    if (buf[6] == 0 && buf[7] == 1) { 
    printf("ERROR: no magic number\n"); 
    return 0; 
    } 
    else if (buf[6] == 0 && buf[7] == 2) { 
    printf("ERROR: incorrect length\n"); 
    return 0; 
    } 
    else if (buf[6] == 0 && buf[7] == 4) { 
    printf("ERROR: port number out of range\n"); 
    } 
    printf("%.*s\n", strlen(buf), buf); 

return 0; 

}

+0

「BUFSIZE」とは何ですか? –

+0

受信したbufが終了していませんか? – arshan

+2

'bzero(buf、BUFSIZE)'、 'n = recvfrom(sockfd、buf、strlen(buf)....'、 'recvfrom何もありません')ネットワークコード内のすべてのstrlen()呼び出しは、 –

答えて

2

通常問題:ここでは、コードのその部分です。

printf("%.*s\n", strlen(buf), buf); 

あなたrecvfrom()コールも間違ってい

printf("%.*s\n", n, buf); 

NBする必要があります:あなたはrecvfrom()で返されるカウントは無視しています。それは次のようになります。あなたは次のif-elseチェーンに入るべきではありません

n = recvfrom(sockfd, buf, sizeof buf, 0, (struct sockaddr *)&serveraddr, 
    &serverlen); 

n < 0場合。

関連する問題