C : error while writing file using UDP socket

标签 c file sockets udp fwrite

我必须通过 UDP 1024 字节的文件(在本例中为 txt 文件)发送到服务器,并将这些字节写入输出文件。我收到此错误:

write(): 错误地址

我需要通过数据结构传递字节,因此创建了一个名为“pkt”的结构,其中包含一个 void *buf,我可以在其中写入字节。 这是我的示例程序。

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define SERV_PORT           5197
#define MAX_BLOCK_SIZE      1024

struct pkt {
    void *buf;
    int num;
};

int main(int argc, char *argv[]) {

    if (argc != 3) {
        fprintf(stderr, "Usage: %s <IP SERVER> <file>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    int sockfd;
    struct sockaddr_in addr;
    int fd;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        perror("socket()");
        exit(EXIT_FAILURE);
    }

    memset((void*)&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(SERV_PORT);

    if (inet_pton(AF_INET, argv[1], &addr.sin_addr) <= 0)
    {
        perror("inet_pton()");
        exit(EXIT_FAILURE);
    }

    fd = open(argv[2], O_RDONLY);
    if(fd == -1)
    {
        perror("open()");
        exit(EXIT_FAILURE);
    }
    //READ FILE
    ssize_t n;
    void *buf;

    buf = alloca(MAX_BLOCK_SIZE);
    n = read(fd, buf, MAX_BLOCK_SIZE);
    if(n != MAX_BLOCK_SIZE)
    {
        perror("read()");
        exit(EXIT_FAILURE);
    }

    struct pkt packet;
    packet.buf = buf;
    packet.num = 0;

    if(sendto(sockfd, &packet, sizeof(struct pkt), 0, (struct sockaddr*)&addr, sizeof(addr)) < 0)
    {
        perror("sendto()");
        exit(EXIT_FAILURE);
    }

    close(fd);

    return EXIT_SUCCESS;

}

服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define SERV_PORT           5197
#define MAX_BLOCK_SIZE      1024

struct pkt {
    void *buf;
    int num;
};

int main() {
    int sockfd;
    struct sockaddr_in addr;
    socklen_t len;
    int output;

    output = open("test.txt", O_WRONLY|O_CREAT, 0664);
    if(output == -1)
    {
        perror("open()");
        exit(EXIT_FAILURE);
    }

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        perror("socket()");
        exit(EXIT_FAILURE);
    }

    memset((void*)&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(SERV_PORT);

    if(bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0)
    {
        perror("bind()");
        exit(EXIT_FAILURE);
    }

    while (1) {
        len = sizeof(addr);
        ssize_t n;

        struct pkt packet;
        n = recvfrom(sockfd, &packet, sizeof(struct pkt), 0, (struct sockaddr*)&addr, &len);
        if( n < 0)
        {
            perror("recvfrom()");
            exit(EXIT_FAILURE);
        }

        printf("Packet number %d\n", packet.num);

        void *buf = (packet.buf);

        if (write(output, buf, MAX_BLOCK_SIZE) == -1) {
            perror("write()");
            exit(EXIT_FAILURE);

        }
    }

    return 0;
}

最佳答案

这一行:

packet.buf = buf;

是代码的主要问题。

这一行所做的只是复制一个指向 buf 的指针。

所以当 sendto() 被执行时,发送的是指针,而不是 buf 的内容。

建议:

替换:

struct pkt {
    void *buf;
    int num;
};

struct pkt {
    char buf[1024];
    int num;
};

并替换为:

packet.buf = buf;

memcpy( packet.buf, buf, sizeof( packet.buf ) );

关于C : error while writing file using UDP socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32254371/

相关文章:

c char[] to jstring printf 适用于 int 类型,但不适用于 string

file - 如何使用 C# 将标签/关键字添加到 Windows 文件属性详细信息选项卡

javascript - 如何在 Socket.IO 上下文中等待 promise

c - 发送到() : Invalid argument - raw socket

c - 如何计算C中unicode字符串中的字符

c++ - 我可以在 C++ 中使用 != 和 == 进行字符串比较而不用自己编写吗?

java - 在 Java 中读取和写入 .txt 文件

javascript - 为什么我的 socket.io 应用程序在 Raspberry pi 上运行时会立即断开连接?

c - c 标准库中函数的 "Implict declaration"? (头文件已经包含)

linux - 为指定文件夹中存在的每个文件将特定文本/字符串写入文本文件