2017-11-07 3 views
0

私はどこでも答えを探しています。私はC言語でコーディングするのが初めてで、教授が私たちに言語を選択させてもらえればそれを愛していたでしょうが、私は逃げ出します。私はOracle V-Boxをローカルで実行していて、UbuntuクライアントとUbuntuサーバーを実行しています。以下のコードをサーバーとクライアントの両方でコンパイルし、いくつかの警告を出します。私はサーバー上でコードを実行して(うまくいくように見える)、クライアント上で実行します。クライアントは、TCPソケット転送(これはうまくいった)と同じように、PDFファイルを送信するよう求めています。また、クライアントとサーバーでWiresharkを実行していますが、要求がクライアントから送信されたように見えますが、サーバーは何もせず、ファイルを引っ張らずに両端に座っています。それがコードなのかどうかは分かりません。UDPクライアント/サーバーc

/* Echo server using UDP */ 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

#define SERVER_UDP_PORT  2466  
#define MAXLEN  4096 

int main(int argc, char **argv) 
{ 
    int  sd, client_len, port, n; 
    char buf[MAXLEN]; 
    struct sockaddr_in  server, client; 

    switch(argc) { 
    case 1: 
     port = SERVER_UDP_PORT; 
     break; 
    case 2: 
     port = atoi(argv[1]); 
     break; 
    default: 
     fprintf(stderr, "Usage: %s [port]\n", argv[0]); 
     exit(1); 
    } 

    /* Create a datagram socket */ 
    if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     fprintf(stderr, "Can't create a socket\n"); 
     exit(1); 
    } 

    /* Bind an address to the socket */ 
    bzero((char *)&server, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(port); 
    server.sin_addr.s_addr = htonl(INADDR_ANY); 
    if (bind(sd, (struct sockaddr *)&server, 
      sizeof(server)) == -1) { 
     fprintf(stderr, "Can't bind name to socket\n"); 
     exit(1); 
    } 

    while (1) { 
     client_len = sizeof(client); 
     if ((n = recvfrom(sd, buf, MAXLEN, 0, 
          (struct sockaddr *)&client, &client_len)) < 0) { 
      fprintf(stderr, "Can't receive datagram\n"); 
      exit(1); 
     } 

     if (sendto(sd, buf, n, 0, 
        (struct sockaddr *)&client, client_len) != n) { 
      fprintf(stderr, "Can't send datagram\n"); 
      exit(1); 
     } 
    } 
    close(sd); 
    return(0); 
} 

私は通常、サーバー上のコードを実行しコンパイルしたら、これはクライアントコード

// UDP Echo Client 

#include <stdio.h> 
#include <string.h> 
#include <sys/time.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#define SERVER_UDP_PORT   2466 
#define MAXLEN     4096 
#define DEFLEN     64 

long delay(struct timeval t1, struct timeval t2) 
{ 
    long d; 
    d = (t2.tv_sec - t1.tv_sec) * 1000; 
    d += ((t2.tv_usec - t1.tv_usec + 500)/1000); 
    return(d); 
} 

int main(int argc, char **argv) 
{ 
    int  data_size = DEFLEN, port = SERVER_UDP_PORT; 
    int  i, j, sd, server_len; 
    char *pname, *host, rbuf[MAXLEN], sbuf[MAXLEN]; 
    struct hostent   *hp; 
    struct sockaddr_in  server; 
    struct timeval   start, end; 
    unsigned long address; 

    pname = argv[0]; 
    argc--; 
    argv++; 
    if (argc > 0 && (strcmp(*argv, "-s") == 0)) { 
     if (--argc > 0 && (data_size = atoi(*++argv))) { 
      argc--; 
      argv++; 
     } 
     else { 
      fprintf(stderr, 
        "Usage: %s [-s data_size] host [port]\n", pname); 
      exit(1); 
     } 
    } 
    if (argc > 0) { 
     host = *argv; 
     if (--argc > 0) 
      port = atoi(*++argv); 
    } 

    else { 
     fprintf(stderr, 
       "Usage: %s [-s data_size] host [port]\n", pname); 
     exit(1); 
    } 

    if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     fprintf(stderr, "Can't create a socket\n"); 
     exit(1); 
    } 

    bzero((char *)&server, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(port); 
    if ((hp = gethostbyname(host)) == NULL) { 
     fprintf(stderr, "Can't get server's IP address\n"); 
     exit(1); 
    } 
    bcopy(hp->h_addr, (char *) &server.sin_addr, hp->h_length); 

    if (data_size > MAXLEN) { 
     fprintf(stderr, "Data is too big\n"); 
     exit(1); 
    } 
    for (i = 0; i < data_size; i++) { 
     j = (i < 26) ? i : i % 26; 
     sbuf[i] = 'a' + j; 
    } // construct data to send to the server 
    gettimeofday(&start, NULL); /* start delay measurement */ 
    server_len = sizeof(server); 
    if (sendto(sd, sbuf, data_size, 0, (struct sockaddr *) 
       &server, server_len) == -1) { 
     fprintf(stderr, "sendto error\n"); 
     exit(1); 
    } 
    if (recvfrom(sd, rbuf, MAXLEN, 0, (struct sockaddr *) 
       &server, &server_len) < 0) { 
     fprintf(stderr, "recvfrom error\n"); 
     exit(1); 
    } 
    gettimeofday(&end, NULL); /* end delay measurement */ 
    if (strncmp(sbuf, rbuf, data_size) != 0) 
     printf("Data is corrupted\n"); 
    close(sd); 
    return(0); 
} 

です:

./udp_server 

だけがクライアントから待って座っています。私は、クライアント上でコードを実行してコンパイルすると

./udp_client -s 1500 10.0.2.11 2466 > test.pdf 

私は

((出力は、クライアントのデスクトップ)に./udp_client -s DATA_RATE SERVER_IP SERVER_PORT>ファイルに)され、これを実行しますこれは単に空白のページを生成します。それはテキストと写真の数ページを持っている必要があります。

私はWiresharkのクライアントから送信していますが、サーバーからの返信はありません。

これは私がターミナル

strace ./udp_server

+0

'strace'の下でサーバを実行してください。これは膨大な量のゴブリンジクを生み出します。ターミナルで噴出が止まるまで待ちます。その後、control-Cを打つことなく、最後の10行から15行のgobbledygook(UNEDITED)をコピーして過去の質問に貼り付けます。次に、送信側のクライアントを実行します。そのため、サーバが動作しているターミナルウィンドウに何かが表示される場合は、それをコピーして質問にも貼り付けてください。 – zwol

+2

デバッガでサーバーを実行しようとしましたが、パケットを受信して​​いますか? – Barmar

+1

サーバでWiresharkを実行して、パケットを受信して​​いるかどうかを確認します。 – Barmar

答えて

2

からSTRACEを実行したときに、私はあなただけのクライアントで受信したデータをプリントアウトするのを忘れて考えて取得していますものです:

if (strncmp(sbuf, rbuf, data_size) != 0) 
    printf("Data is corrupted\n"); 
close(sd); 

printf(rbuf); // <---- 

return(0); 

あなたクライアントコードは現在、エラーメッセージのみを出力します。すべてが機能しても、出力は生成されません。

+0

OPによると、wiresharkはサーバーからの返信を表示していません。 –

+1

@MartinJames:コードをローカルでテストしたところ、期待した結果が得られました。 – Blender

+0

変更を実行しようとしました...成功しませんでした。 – MathiasKroll