2017-07-18 3 views
-1

Je souhaite envoyer un paquet UDP.C++ UDP bind() renvoie toujours -1

J'utilise Visual Studio C++ 2017, et je suis lié la lib Ws2_32.Lib

Voici le code de l'échantillon nécessaire pour illustrer ce problème:

#include <iostream> 
#include <winsock2.h> 
#include <sys/types.h> 
#include <memory.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

#include <ws2tcpip.h> 


int main() 
{ 
    sockaddr_in serverAddress; 
    memset(&serverAddress, 0, sizeof(serverAddress)); 
    serverAddress.sin_family = AF_INET;// AF_UNSPEC; 
    serverAddress.sin_addr.s_addr = INADDR_ANY; 
    serverAddress.sin_port = htons(20000); 

    int result = 0; 
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); //socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    result = bind(sock, (sockaddr*)&serverAddress, sizeof(serverAddress)); 
    if (result == -1) 
    { 
     std::cout << "error!!!!!! Why?"; 
    } 
} 

Pourquoi ne puis-je simplement bind() le socket ici ?

J'ai vu this poster ici, mais cela ne m'a pas aidé, puisque celui-ci était juste un problème de parenthèse.

+0

Et l'erreur était? – EJP

+0

@EJP veuillez lire le titre. – waas1919

+3

J'ai lu non seulement votre titre, mais l'ensemble de votre message, et votre commentaire inepte. Vous n'avez pas fourni l'erreur. -1 n'est pas une erreur. C'est une * valeur de retour * qui * indique * une erreur. L'erreur réelle pour un appel Winsock est fournie par 'WSAGetLastError()'. C'est plutôt basique. Veuillez corriger votre code pour imprimer la valeur de l'erreur et inclure le résultat dans votre message. – EJP

Répondre

-1

Voici la réponse. Je ne créais pas le socket correctement.

//init 
int server_length; 
int port = 20000; 
const int STRLEN = 256; 
char recMessage[STRLEN]; 
char sendMessage[STRLEN]; 
char *sendMes = "SERVER READY"; 
WSADATA wsaData; 
SOCKET mySocket; 
SOCKET myBackup; 
SOCKET acceptSocket; 
sockaddr_in myAddress; 

//create socket 
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR) 
{ 
    cerr << "Socket Initialization: Error with WSAStartup\n"; 
    system("pause"); 
    WSACleanup(); 
    exit(10); 
} 

mySocket = socket(AF_INET, SOCK_DGRAM, 0); 
if (mySocket == INVALID_SOCKET) 
{ 
    cerr << "Socket Initialization: Error creating socket" << endl; 
    system("pause"); 
    WSACleanup(); 
    exit(11); 
} 

myBackup = mySocket; 

//bind 
myAddress.sin_family = AF_INET; 
myAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 
myAddress.sin_port = htons(port); 

if (bind(mySocket, (SOCKADDR*)&myAddress, sizeof(myAddress)) == SOCKET_ERROR) 
{ 
    cerr << "ServerSocket: Failed to connect\n"; 
} 
+0

Vous n'initialisiez pas Winsock. Vous étiez en train de créer le socket correctement. – EJP

3

Vous devez appeler WSAStartup() au début de WinSock:

WSADATA data; 
::WSAStartup(MAKEWORD(2, 0), &data); 

Et vous devez appeler WSACleanup() à la fin:

::WSACleanup(); 

Mais avant de continuer, pensez à IPV6. sockaddr_in ne fonctionne qu'avec IPV4.