【问题标题】:UDP socket: invalid argument error in sendtoUDP 套接字:sendto 中的参数无效错误
【发布时间】:2018-06-16 12:30:30
【问题描述】:

我正在尝试编写一个简单的UDP 套接字客户端-服务器程序。客户端机器应该向服务器发送一个字符串,服务器会回复一个ACK 消息。

下面是客户端的实现:

int main() {
    message_send('L');
    return EXIT_SUCCESS;
}


int message_send(char code) {
    int sockfd;
    ssize_t n;
    char recvline[MAXLINE + 1];
    struct sockaddr_in servaddr;
    // Create an UDP socket
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("socket");
        return -1;
    }

    // Setup the socket
    memset((void *) &servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = (in_port_t) htonl(SERV_PORT);
    if (inet_pton(AF_INET, SERVIP, &servaddr.sin_addr) <= 0) {
        fprintf(stderr, "Error in inet_pton for %s\n", SERVIP);
        exit(1);
    }

    // Send a test string
    char *test = malloc(MAXLINE);
    snprintf(test, MAXLINE, "SENDING:%c", code);
    if (sendto(sockfd, &test, sizeof(test), 0, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
        perror("sendto");
        return -1;
    }

    // Get an answer from the server
    n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);
    if (n < 0) {
        perror("recvfrom");
        exit(1);
    } else if (n > 0) {
        recvline[n] = 0; // Add ending character
        if (fputs(recvline, stdout) == EOF) { // Print the received message in stdout
            perror("fputs");
            return -1;
        }
    }
    return 0;
}

如果我运行它(无论服务器机器是否正在运行),我都会收到以下错误:

sendto: 无效参数

为什么会出现这个错误?

【问题讨论】:

  • @user3386109 感谢您的回答,解决了我的问题
  • @user3386109:为什么不把这个作为答案呢?
  • @user3386109 确实,这可以作为副本有用。
  • 好的,我将评论转换为答案。

标签: c sockets udp


【解决方案1】:

问题最可能的原因是线路

servaddr.sin_port = (in_port_t) htonl(SERV_PORT);

我猜这会给你一个错误的端口号(即它会给你一个小端机器上的端口 0)。端口号是 16 位的,因此您应该使用 htons

此外,将&amp;testsizeof(test) 传递给sendto 将通过网络发送指针值。要发送字符串,您需要使用teststrlen(test)+1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2016-01-07
    • 2015-07-27
    • 1970-01-01
    • 2018-10-11
    • 2020-09-16
    • 2011-02-09
    相关资源
    最近更新 更多