2017-07-18 13 views
-1

UDPパケットを送信します。C++ UDP bind()は常に-1を返します

私はVisual Studio C++ 2017を使用している、と私は、これは、この問題を説明するために必要なサンプルコードでLIBにWs2_32.Lib

をリンクした:

#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?"; 
    } 
} 

なぜできない私だけでbind()ここsocket

私はここにthis投稿を見ましたが、これはちょうどかっこの問題だったので、これは私を助けませんでした。

+0

エラーがありましたか? – EJP

+0

@EJPタイトルを読んでください。 – waas1919

+3

私はあなたのタイトルだけでなく、あなたの全体のポスト、あなたの無邪気なコメントを読んだ。あなたはエラーを提供していません。 -1はエラーではありません。 *エラーを示す*戻り値*です。 Winsock呼び出しの実際のエラーは 'WSAGetLastError()'によって提供されます。これはむしろ基本的なものです。エラー値を印刷して結果をあなたの投稿に含めるようにコードを修正してください。 – EJP

答えて

-1

これが答えです。私は正しくソケットを作成していませんでした。

//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

あなたはWinsockを初期化していませんでした。あなたは正しくソケットを作成していました。 – EJP

3

あなたはWinSockのために先頭にWSAStartupの()をコールする必要があります。

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

そして、あなたが最後にWSACleanup()をコールする必要があります。

::WSACleanup(); 

しかし、継続する前に、IPV6について検討してください。 sockaddr_inはIPV4でのみ動作します。

関連する問題