UDP客户端/服务器c

时间:2017-11-07 19:11:55

标签: c sockets udp wireshark

我一直在寻找答案。我是C语言的新手,如果我的教授允许我们选择语言,我会喜欢它,但我离题了。我正在运行Oracle V-Box本地运行Ubuntu客户端和Ubuntu服务器。我在服务器和客户端上编译了下面的代码,但有一些警告。我在服务器上运行代码(似乎很好),然后在客户端上运行。客户端要求发送PDF文件就像我使用TCP套接字传输一样(效果很好)。我还在客户端和服务器上运行Wireshark,看起来请求是从客户端发出的,但服务器没有做任何事情,只是坐在两端而不拉动文件。不确定是代码还是其他东西。

/* 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&gt;(输出到客户端桌面上的文件))

这只会产生一个空白页面。它应该有几页文字和图片。

我也是从Wireshark的客户端发出的,但没有来自服务器的回复。

这是我从终端

运行STRACE时得到的结果

strace ./udp_server

1 个答案:

答案 0 :(得分:2)

我想您忘记在客户端打印出收到的数据:

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

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

return(0);

您的客户端代码目前仅打印出错误消息。如果一切正常,它将不会产生任何输出。