简体   繁体   English

未在客户端获取 output(C 中的 UDP 套接字)

[英]Not Getting the output at the client side (UDP socket in C)

Here is my code for the server and the client side of the UDP socket.这是我的 UDP 套接字的服务器和客户端的代码。

The issue is, when I am running this in the terminal, the server execution stops as soon as the client reaches the server, but on the client side I did not receive any data.问题是,当我在终端中运行它时,一旦客户端到达服务器,服务器执行就会停止,但在客户端我没有收到任何数据。

Client.c客户端.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int network_socket;

    network_socket = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in server_address;

    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9002);
    server_address.sin_addr.s_addr = INADDR_ANY;

    sendto(network_socket, 0, 0, MSG_CONFIRM, (const struct sockaddr *) &server_address, sizeof(server_address));
    char server_response[256];
    int len = sizeof(network_socket);
    int = recvfrom(network_socket, &server_response, sizeof(server_response), 0,(struct sockaddr*) &network_socket, (socklen_t*)&len);

    printf("The server sent the data : %s\n", server_response);

    close(network_socket);
    return 0;
}

Server.c服务器.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    char server_message[256] = "you have reached the UDP server";

    int server_socket,client_address;
    server_socket = socket(AF_INET, SOCK_DGRAM,0);

    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9002);
    server_address.sin_addr.s_addr = INADDR_ANY;

    bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address));

    int n,len;
    len = sizeof(client_address);
    n = recvfrom(server_socket, server_message, sizeof(server_message), 0, (struct sockaddr *) &client_address, (socklen_t*)&len);

    sendto(server_socket, server_message, sizeof(server_message), 0, (struct sockaddr *) &client_address, len);
    close(server_socket);
    return 0;
}
sendto(network_socket, 0, 0, MSG_CONFIRM, (const struct sockaddr *) &server_address, sizeof(server_address));

You aren't sending any data.您没有发送任何数据。

int = recvfrom(network_socket, &server_response, sizeof(server_response), 0,(struct sockaddr*) &network_socket, (socklen_t*)&len);

printf("The server sent the data : %s\n", server_response);

You didn't keep the number of bytes you received, that's what recvfrom returns.您没有保留收到的字节数,这就是recvfrom返回的内容。 So you have no idea how much data you received.所以你不知道你收到了多少数据。 You then try to print this data through %s , which is only for C-style strings.然后,您尝试通过%s打印此数据,这适用于 C 风格的字符串。 You can't use it to print arbitrary data.您不能使用它来打印任意数据。 At a minimum, you have to tell it how much data to print (otherwise, how could it possibly know?) and you threw that information away.至少,你必须告诉它要打印多少数据(否则,它怎么可能知道?)然后你把这些信息扔掉了。

On both sides, you are not doing any error handling at all.在双方,您根本没有进行任何错误处理。

On the client side, you can't send datagrams to INADDR_ANY , you need to send to an actual IP address.在客户端,您不能将数据报发送到INADDR_ANY ,您需要发送到实际的 IP 地址。 And when calling recvfrom() , you are using the network_socket file descriptor as a sockaddr_in struct to receive the sender's address/port, which is just wrong.并且在调用recvfrom()时,您使用network_socket文件描述符作为sockaddr_in结构来接收发送者的地址/端口,这是错误的。

On the server side, you are declaring client_address as an int when it needs to be a sockaddr_in struct instead.在服务器端,您将client_address声明为int当它需要成为sockaddr_in结构时。 And you are using the same char[] buffer to receive the client's data that you use to store your server's greeting message, so you are effectively echoing back what the client sends (which is nothing), but you are not taking the size of the client's data into account.而且您正在使用相同的char[]缓冲区来接收用于存储服务器问候消息的客户端数据,因此您实际上是在回显客户端发送的内容(这没什么),但您并没有占用客户的数据考虑在内。 And you are misusing printf() after recvfrom() exits, since the client is not sending a null-terminated string, but %s expects one.并且您在recvfrom()退出后滥用printf() ,因为客户端没有发送以 null 结尾的字符串,但%s需要一个。

Try this instead:试试这个:

Client.c客户端.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int network_socket = socket(AF_INET, SOCK_DGRAM, 0);
    if (network_socket < 0)
    {
        perror("socket() failed");
        return -1;
    }

    struct sockaddr_in server_address;

    bzero(&server_address, sizeof(server_address));
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9002);
    server_address.sin_addr.s_addr = inet_addr("Server IP Address Here"); // or "127.0.0.1" for localhost

    if (sendto(network_socket, 0, 0, MSG_CONFIRM, (struct sockaddr *) &server_address, sizeof(server_address)))
    {
        perror("sendto() failed");
        close(network_socket);
        return -1;
    }

    char server_response[256];

    struct sockaddr_in sender_address;
    socklen_t addrlen = sizeof(sender_address);

    int n = recvfrom(network_socket, server_response, sizeof(server_response), 0, (struct sockaddr*) &sender_address, &addrlen);
    // or, since you are not using the sender's sockaddr_in for anything:
    // int n = recvfrom(network_socket, server_response, sizeof(server_response), 0, NULL, NULL);
    if (n < 0)
    {
        perror("recvfrom() failed");
        close(network_socket);
        return -1;
    }

    printf("The server sent the data : %.*s\n", n, server_response);

    close(network_socket);
    return 0;
}

Server.c服务器.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main()
{
    char server_message[] = "you have reached the UDP server";

    int server_socket = socket(AF_INET, SOCK_DGRAM, 0);
    if (server_socket < 0)
    {
        perror("socket() failed");
        return -1;
    }

    struct sockaddr_in server_address;

    bzero(&server_address, sizeof(server_address));
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9002);
    server_address.sin_addr.s_addr = INADDR_ANY;

    if (bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address)) < 0)
    {
        perror("bind() failed");
        close(server_socket);
        return -1;
    }

    char client_message[256];

    struct sockaddr_in client_address;
    socklen_t addrlen = sizeof(client_address);

    int n = recvfrom(server_socket, client_message, sizeof(client_message), 0, (struct sockaddr *) &client_address, &addrlen);
    if (n < 0)
    {
        perror("recvfrom() failed");
        close(server_socket);
        return -1;
    }

    printf("The client sent the data : %.*s\n", n, client_message);

    if (sendto(server_socket, /*client_message*/server_message, /*n*/strlen(server_message), 0, (struct sockaddr *) &client_address, addrlen) < 0)
    {
        perror("sendto() failed");
        close(server_socket);
        return -1;
    }

    close(server_socket);
    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM