代码之家  ›  专栏  ›  技术社区  ›  Bernie Perez

我的UDP客户端服务器有什么问题?

  •  0
  • Bernie Perez  · 技术社区  · 15 年前

    我有一个UDP服务器,它应该坐在那里等待客户端连接到它,然后向它发送一个文件名字符串。现在我只希望它将文件名回显到客户端。这是我的密码

    服务器

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    
    #define MAXBUFLEN 1024
    
    // Usage: ./server PORT
    int main(int argc, char *argv[])
    {
        int sockfd;
        struct sockaddr_in server;
        size_t clientSize;
        struct sockaddr_storage client;
        char buf[MAXBUFLEN];
        int portno = atoi(argv[1]);
        int numbytes;
    
        printf("Port: %d\n", portno);
    
        // Create UDP Socket
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
            perror("Can't create socket");
            exit(-1);
        }
    
        // Configure socket
        memset(&server, 0, sizeof server);
        server.sin_family = AF_INET; // Use IPv4
        server.sin_addr.s_addr = INADDR_ANY; // My IP
        server.sin_port = htons(portno); // Server Port
    
        // Bind socket
        if ((bind(sockfd, (struct sockaddr *) &server, sizeof(server))) == -1) {
            close(sockfd);
            perror("Can't bind");
        }
    
        while (1) {
            printf("Waiting for data...\n");
    
            // Receive data from Client
            clientSize = sizeof(client);
            numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1,0,
                    (struct sockaddr *) &client, &clientSize);
    
            buf[numbytes] = '\0';
    
            printf("client sent: %s\n", buf);
    
            // Rely to client
            sendto(sockfd, buf, MAXBUFLEN-1, 0,
                    (struct sockaddr *) &client, &clientSize);
        }
    
        printf("Closing");
        close(sockfd);
    
        return 0;
    }
    

    客户

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    
    #define MAXBUFLEN 1024
    
    //Usage: ./client PORT IP FILE
    int main(int argc, char *argv[]) {
        int sockfd;
        struct sockaddr_in server;
    //  struct sockaddr_storage client;
        char buf[MAXBUFLEN];
        int portno = atoi(argv[1]);
        char *serverIP = argv[2];
        char *filename = argv[3];
        int numbytes;
    
        printf("Port: %d, IP:%s, File:%s\n", portno, serverIP, filename);
    
        // Create UDP Socket
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
            perror("Can't create socket");
            exit(-1);
        }
    
        // The server IP and Port
        memset(&server, 0, sizeof server);
        server.sin_family = AF_INET; // Use IPv4
        server.sin_port = htons(portno); // Server Port
        struct hostent *hp = gethostbyname(serverIP);
        memcpy((char*)&server.sin_addr, (char*)hp->h_name, hp->h_length);
    
        printf("Sent %s\n", filename);
    
        // No need to bind, just send request for file
        int serverSize = sizeof(server);
        sendto(sockfd, argv[3], strlen(argv[3]), 0,
                (struct sockaddr *) &server, serverSize);
    
        printf("Waiting for reply\n");
    
        recvfrom(sockfd, buf, MAXBUFLEN-1, 0,
                (struct sockaddr *) &server, serverSize);
    
        buf[numbytes] = '\0';
    
        printf("server sent: %s\n", buf);
    
        close(sockfd);
    }
    

    到目前为止,服务器只是打印出来

    Waiting for data...
    

    只有一次。。。所以它永远不会收到请求。

    客户端打印出:

    ./client 8083 127.0.0.1 hello
    Port: 8083, IP:127.0.0.1, File:hello
    Sent hello
    Waiting for reply
    server sent: 
    

    请帮忙,我对C和UDP套接字的世界还不熟悉。

    哦,是的,我已经读过比吉的指南了。。。请不要只是把它作为一个答案。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Tommy McGuire    15 年前

    最大的问题可能是您正在复制hp->将h_名称放入服务器的sin_addr元素中。你的名字是 名称 主机的名称,而不是IP地址。试着替换

    
        memcpy((char*)&server.sin_addr, (char*)hp->h_name, hp->h_length);
    

    具有

    
        memcpy((char*)&server.sin_addr, (char*)hp->h_addr_list[0], hp->h_length);
    

    在你的客户身上。

        2
  •  1
  •   t0mm13b    15 年前

    客户机中的numbytes未初始化,也未使用!请再次检查您的代码。。。。

    顺致敬意,

        3
  •  1
  •   Bernie Perez    15 年前

    修正了错误!谢谢你,汤米。这是我现在正在运行的。

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdio.h>
    
    #define MAXBUFLEN 1024
    
    void error(char *msg) {
        perror(msg);
        exit(0);
    }
    
    int main(int argc, char *argv[]) {
        int sockfd;
        struct sockaddr_in server, client;
        int serverSize, clientSize, numbytes;
        char buf[MAXBUFLEN];
        int portno = atoi(argv[1]);
    
        if (argc < 2) {
            fprintf(stderr, "ERROR, no port provided\n");
            exit(0);
        }
    
        printf("Running on Port: %d\n", portno);
    
        // Create UDP Socket
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sockfd < 0) {
            error("Can't create socket");
        }
    
        // Configure Server Info
        serverSize = sizeof(server);
        bzero(&server, serverSize);
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_port = htons(portno);
    
        // Bind
        if (bind(sockfd, (struct sockaddr *) &server, serverSize) < 0) {
            error("binding");
        }
    
        clientSize = sizeof(struct sockaddr_in);
    
        while (1) {
            printf("Waiting for Client Request...\n");
            numbytes = recvfrom(sockfd, buf, MAXBUFLEN, 0,
                    (struct sockaddr *) &client, &clientSize);
            if (numbytes < 0) {
                error("recvfrom");
            }
            buf[numbytes] = '\0';
    
            printf("Received request for File: %s\n", buf);
            numbytes = sendto(sockfd, buf, sizeof(buf), 0,
                    (struct sockaddr *) &client, clientSize);
            if (numbytes < 0) {
                error("sendto");
            }
            sendFile(sockfd, client);
        }
    }
    
    sendFile(int sockfd, struct sockaddr_in client) {
    
    }
    

    客户:

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <stdio.h>
    
    #define MAXBUFLEN 1024
    
    void error(char *msg) {
        perror(msg);
        exit(0);
    }
    
    int main(int argc, char *argv[]) {
        int sockfd;
        struct sockaddr_in server, client;
        int serverSize;
        struct hostent *hp;
        char buf[MAXBUFLEN];
        int numbytes;
        char *serverIP = argv[1];
        int portno = atoi(argv[2]);
        char *filename = argv[3];
        int done = 1;
    
        if (argc != 4) {
            printf("Usage: SERVER PORT FILENAME\n");
            exit(1);
        }
    
        // Create Socket
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sockfd < 0) {
            error("Can't create socket");
        }
    
        // Configure Server Info
        server.sin_family = AF_INET;
        hp = gethostbyname(serverIP);
        if (hp == 0)
            error("Unknown host");
        bcopy((char *) hp->h_addr, (char *) &server.sin_addr, hp->h_length);
        server.sin_port = htons(portno);
        serverSize = sizeof(struct sockaddr_in);
    
        // Send Message
        strcat(buf, filename);
        numbytes = sendto(sockfd, buf, strlen(buf), 0, &server, serverSize);
        if (numbytes < 0)
            error("Sendto");
        bzero(buf, MAXBUFLEN);
    
        // Build file then set Done = 0
        while (done) {
            numbytes = recvfrom(sockfd, buf, MAXBUFLEN, 0, &client, &serverSize);
            if (numbytes < 0)
                error("recvfrom");
    
            done = 0;
        }
    
        printf("Received the packet: %s\n", buf);
    }
    

    http://www.linuxhowtos.org/C_C++/socket.htm

        4
  •  0
  •   scope_creep    15 年前

    愚蠢的问题,但你的防火墙阻止端口8083。

    上下快速移动