【问题标题】:Coding UDP Socket in C - sendto Invalid Arguments在 C 中编码 UDP 套接字 - sendto 无效参数
【发布时间】:2016-03-01 10:07:25
【问题描述】:

我实际上又回到了用 C 语言编程,我想编写一个 UDP 客户端

我的问题是我在执行 sendto 函数时出错...得到 errno : 22 和消息错误: 参数无效

char query[1024];
int querySize = strlen(query);

SOCKADDR_IN dest = { 0 };
int destSize = sizeof dest;

dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr('192.168.0.3');
dest.sin_port = htons(6000);

sendto(sock, query, querySize, 0, (SOCKADDR *) &dest, destSize)

希望有人能帮助我吗?

这是我的完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#if defined (WIN32)
    #include <winsock2.h>
    typedef int socklen_t;
#elif defined (linux)
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>

    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)

    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
#endif

int main(int argc, char *argv[]) {
    #if defined (WIN32)
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,2), &WSAData);
    #endif

    char source_ip[15] = "192.168.0.20";
    int source_port = 5000;

    char query[1024];

    printf("- Opening Socket\n");
    SOCKET sock;
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock == INVALID_SOCKET) {
        perror("[ERROR] socket()");
        exit(errno);
    }

    printf("- Configuring socket source to : [%s:%d]\n", source_ip, source_port);
    SOCKADDR_IN source;
    source.sin_family = AF_INET;
    source.sin_addr.s_addr = inet_addr(source_ip);   
    source.sin_port = htons(source_port);
    if(bind(sock, (SOCKADDR *)&source, sizeof(source)) == SOCKET_ERROR) {
        perror("[ERROR] bind()");
        exit(errno);
    }

    int querySize = strlen(query);
    SOCKADDR_IN dest = { 0 };
    int destSize = sizeof dest;
    dest.sin_family = AF_INET;

    printf("- Sending packets\n");
    dest.sin_addr.s_addr = inet_addr('192.168.0.3');
    dest.sin_port = htons(6000);

    if(sendto(sock, query, querySize, 0, (SOCKADDR *) &dest, destSize) < 0) {
        perror("[ERROR] sendto()");
        printf("%d\n", errno);
        exit(errno);
    }

    printf("\n\n##############################\n");
    printf("Closing socket ...\n");
    closesocket(sock);

    #if defined (WIN32)
        WSACleanup();
    #endif

    printf("Program finished.\n");
    return 0;
}

【问题讨论】:

  • 请在此处发布您的代码的相关部分,而不是在第三方网站上。

标签: sockets udp errno sendto


【解决方案1】:

你注意到了吗, 该查询没有被初始化? 所以 strlen(query) 可能会导致“非常长”的缓冲区。 这将是一个很好的 EINVAL 候选者。

【讨论】:

  • 即使我初始化缓冲区仍然会出现错误:(
猜你喜欢
  • 2018-06-16
  • 2016-01-07
  • 2014-01-04
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多