Network:UDP广播消息的测试
2015-07-17 13:09
567 查看
这篇博客流程比较规范:http://blog.csdn.net/great3779/article/details/5699986
我自己的代码如下,仅仅是测试
// BroadCastReceiver.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
//接受方
int main(int argc, char* argv[])
{
WSADATA wsaData;
if (NO_ERROR != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
printf("winsock load failed!\n");
return 1;
}
if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
{
return 1;
}
printf("winsock load success.\n");
//绑定在本机上的地址
sockaddr_in bind_addr = { 0 };
bind_addr.sin_family = AF_INET;
bind_addr.sin_port = htons(9097);
bind_addr.sin_addr.s_addr = INADDR_ANY;
//int bind_addr_size = sizeof(bind_addr);
//接受广播消息的地址
sockaddr_in recv_broadcast_addr = { 0 };
recv_broadcast_addr.sin_family = AF_INET;
recv_broadcast_addr.sin_port = htons(9097);
//广播消息255.255.255.255
recv_broadcast_addr.sin_addr.s_addr = INADDR_BROADCAST;
int recv_broadcast_addr_len = sizeof(recv_broadcast_addr);
SOCKET recv_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (INVALID_SOCKET == recv_sock)
{
printf("socket init failed\n");
return -1;
}
int opval = 1;
//设置为广播类型
setsockopt(recv_sock, SOL_SOCKET, SO_BROADCAST, (const char*)&opval, sizeof(opval));
if (SOCKET_ERROR == bind(recv_sock, (SOCKADDR*)&bind_addr, sizeof(bind_addr)))
{
printf("bind failed\n");
return -1;
}
printf("bind success.\n");
char recv_buffer[MAXBYTE] = { 0 };
printf("wait for recv...\n");
//从广播地址上接受
if (SOCKET_ERROR == recvfrom(recv_sock, recv_buffer, MAXBYTE, 0, (SOCKADDR*)&recv_broadcast_addr, &recv_broadcast_addr_len))
{
printf("recvfrom error\n");
return -1;
}
printf("recv %s\n", recv_buffer);
//ZeroMemory(recv_buffer, MAXBYTE);
system("pause");
WSACleanup();
closesocket(recv_sock);
return 0;
}
我自己的代码如下,仅仅是测试
// BroadCastReceiver.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
//接受方
int main(int argc, char* argv[])
{
WSADATA wsaData;
if (NO_ERROR != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
printf("winsock load failed!\n");
return 1;
}
if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
{
return 1;
}
printf("winsock load success.\n");
//绑定在本机上的地址
sockaddr_in bind_addr = { 0 };
bind_addr.sin_family = AF_INET;
bind_addr.sin_port = htons(9097);
bind_addr.sin_addr.s_addr = INADDR_ANY;
//int bind_addr_size = sizeof(bind_addr);
//接受广播消息的地址
sockaddr_in recv_broadcast_addr = { 0 };
recv_broadcast_addr.sin_family = AF_INET;
recv_broadcast_addr.sin_port = htons(9097);
//广播消息255.255.255.255
recv_broadcast_addr.sin_addr.s_addr = INADDR_BROADCAST;
int recv_broadcast_addr_len = sizeof(recv_broadcast_addr);
SOCKET recv_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (INVALID_SOCKET == recv_sock)
{
printf("socket init failed\n");
return -1;
}
int opval = 1;
//设置为广播类型
setsockopt(recv_sock, SOL_SOCKET, SO_BROADCAST, (const char*)&opval, sizeof(opval));
if (SOCKET_ERROR == bind(recv_sock, (SOCKADDR*)&bind_addr, sizeof(bind_addr)))
{
printf("bind failed\n");
return -1;
}
printf("bind success.\n");
char recv_buffer[MAXBYTE] = { 0 };
printf("wait for recv...\n");
//从广播地址上接受
if (SOCKET_ERROR == recvfrom(recv_sock, recv_buffer, MAXBYTE, 0, (SOCKADDR*)&recv_broadcast_addr, &recv_broadcast_addr_len))
{
printf("recvfrom error\n");
return -1;
}
printf("recv %s\n", recv_buffer);
//ZeroMemory(recv_buffer, MAXBYTE);
system("pause");
WSACleanup();
closesocket(recv_sock);
return 0;
}
// BroadCastMessage.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <WinSock2.h> #include <windows.h> #include <process.h> #pragma comment(lib,"ws2_32.lib") //发送方 int main(int argc, char* argv[]) { WSADATA wsaData; if (NO_ERROR != WSAStartup(MAKEWORD(2, 2), &wsaData)) { printf("winsock load failed!\n"); return 1; } if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion)) { return 1; } printf("winsock load success.\n"); SOCKET send_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //SOCKET recv_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (send_sock == INVALID_SOCKET) { printf("socket init failed, error code:\n",WSAGetLastError()); return -1; } printf("socket init success.\n"); //设置广播类型的地址 sockaddr_in broadcast_addr = { 0 }; broadcast_addr.sin_family = AF_INET; broadcast_addr.sin_addr.s_addr = INADDR_BROADCAST; broadcast_addr.sin_port = htons(9097); int opval = 1; //设置广播类型的套接字 setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (const char*)&opval, sizeof(opval)); char helo[] = "helo"; //从广播地址向外发送广播消息 if (SOCKET_ERROR == sendto(send_sock, helo, strlen(helo), 0, (SOCKADDR*)&broadcast_addr, sizeof(broadcast_addr))) { printf("send failed.error code:%d\n",WSAGetLastError()); system("pause"); return -1; } printf("broad success...\n"); //HANDLE recv_handle = (HANDLE)_beginthreadex(NULL, NULL, handle_recv, &recv_sock, 0, NULL); //WaitForSingleObject(recv_handle,INFINITE); WSACleanup(); closesocket(send_sock); system("pause"); //closesocket(recv_sock); return 0; }