您的位置:首页 > 理论基础 > 计算机网络

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;
}

// 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 network udp