2016-03-29 14 views
0

目的: 私のコードはソケットを作成してクライアントからパッケージを受け取ることです(このクライアントは500msごとにメッセージをブロードキャストします)。 現象: ソケットがホストソケットとして作成されると、revfrom()を直接使用するとrevfrom関数から-1が返されます。しかし、sendto()関数をパケットとともに使用すると、revfrom()をすぐに使用してください。これは必要なパケットを見つけるのに役立ちます。それは、クライアントソケットのように見えますが、私はそれをサーバーソケットとして作成しました。 は私のコードです。ありがとうございます。 コード:UDPソケットrevfrom()戻りエラー

SOCKET s; 
sockaddr_in addrDest; 
sockaddr_in addrLocal; 
int result; 
char udp_buff[AMP_MAX_PACKET_SIZE]; 

WSADATA wsaData; 
wchar_t msgbuf[100]; 

int addrDestSize = sizeof(SOCKADDR_IN); 

// initialize winsock 
result = WSAStartup(MAKEWORD(2, 2), &wsaData); 
if (result != NO_ERROR) { 
    wprintf(L"WSAStartup failed with error: %d\n", result); 
    //return 1; 
} 

// create the socket 
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // UDP socket 

u_long iMode = 1; 
result = ioctlsocket(s, FIONBIO, &iMode); 
if (result != NO_ERROR) 
    printf("ioctlsocket failed with error: %ld\n", result); 

addrLocal.sin_family = AF_INET; 
addrLocal.sin_port = htons(16717); 
addrLocal.sin_addr.s_addr = htonl(INADDR_ANY); // zero-init sin_addr to tell it to use all available adapters on the local host 

               // associate this socket with local UDP port 16717 
result = bind(s, (struct sockaddr*)&addrLocal, sizeof(addrLocal)); 

addrDest.sin_family = AF_INET; 
addrDest.sin_port = htons(16717); 
inet_pton(AF_INET, "192.168.99.255", &(addrDest.sin_addr)); 

uint8_t node_address_temp[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };  //array 
std::vector<uint8_t> node_address(node_address_temp, node_address_temp + sizeof(node_address_temp)/sizeof(uint8_t)); 
//formatDataPack("MID", dataPack, node_address); 
//SendCMDToGauge(&s, &dataPack, &addrDest); 
result = sendto(s, " ", strlen(" ") + 1, 0, (SOCKADDR *)&addrDest, sizeof(addrDest)); 

result = -1; 
while (result < 0) { 
    result = recvfrom(s, (char*)&udp_buff, sizeof(udp_buff), 0, (SOCKADDR *)&addrDest, &addrDestSize); 
    //result = recv(s, (char*)&udp_buff, sizeof(udp_buff), 0); 
    swprintf(msgbuf, 100, L"Revfrom Result: %d\n", result); 
    OutputDebugString(msgbuf); 
    Sleep(500); 
    if (result = 36) 
     result = -1; 
} 
+0

正直なところ、私はどのように定義するのかは分かりません。私のアプリケーションでは、私のPCはネットワーク上のWi-Fiデバイスと話をし、ダイスが絶えず送信するパケットからMACアドレスを取得する必要があります。後でPCからフォーマットされたパックを送信することでこのデバイスを制御します。アプリケーションから、私はそれがサーバーだと思いますか? – Jacob

+0

"ホストソケット"、 "クライアントソケット"、 "サーバーソケット"の違いは何だと思いますか?コードの振る舞いに何らかの影響を及ぼすタイプの2種類(あるいは多分3種類)のソケットについて話しているようです。私はあなたがこれらの言葉によって何を意味するのか分かりません。 「クライアントソケット」とは何ですか? –

+0

私が間違った言葉を使うと私は許します。これらの用語にかかわらず、基本的にrecfrom()を使ってネットワークからデータを受け取る方法を理解しようとしています。 – Jacob

答えて

1

表示される動作は予期されています。あなたはソケット非ブロックを設定しました。したがって、recvfromに電話して、その時点で受信するものがない場合、ブロックするのではなく-1を返します。

+0

私は本当に感謝しているケースを処理するためのいくつかのサンプルコードを提供することができますソケットに非常に新しいです。 – Jacob

+0

特別なことは何もありません。これは予想される動作です。あなたのコードはすでにそれを処理しています、あなたはそれが起こっていることに驚いているようです。 –

+0

@Jacobええ..もしそれを待たせたいのであれば、なぜそれを非ブロックに設定しましたか? –

関連する問題