Кодирование сокета UDP на C - недопустимые аргументы sendto

На самом деле я вернулся к программированию на 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;
}

person McH    schedule 01.03.2016    source источник
comment
пожалуйста, разместите соответствующие части вашего кода здесь, а не на стороннем сайте.   -  person Alnitak    schedule 01.03.2016


Ответы (1)


Вы заметили, что этот запрос не инициализируется? Таким образом, strlen (запрос) может привести к «очень длинному» буферу. Это был бы хороший кандидат на EINVAL.

person rpy    schedule 01.03.2016
comment
По-прежнему появляется ошибка, даже если я инициализирую буфер :( - person McH; 01.03.2016