2016-03-01 2 views
0

Je suis effectivement de retour à la programmation en C, et je veux coder un client UDP.Codage UDP Socket en C - sendto Arguments non valides

Mon problème est que je vais avoir une erreur lors de l'exécution de la fonction sendto ... se errno: 22 et l'erreur de message: Invalid argument

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) 

quelqu'un Hope pourrait m'aider?

Voici mon code complet:

#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; 
} 
+0

veuillez poster les parties _relevant_ de votre code ici, pas sur un site tiers. – Alnitak

Répondre

0

Avez-vous remarqué, cette requête n'est pas en cours d'initialisation? Donc strlen (requête) peut entraîner un tampon "très long". Ce serait un bon candidat pour un EINVAL.

+0

Toujours obtenir l'erreur même si j'initialise le tampon :( – McH