社区
C++ 语言
帖子详情
Socket发送和接收广播
yuanpu10
2012-01-10 02:37:51
通过以下方法发送广播C#语言能够正常接收,JAVA也能正常接收,C++无法接收(C++接收C++可以正常接收),请各位大虾帮忙解决,小弟不胜感激,最好能提供C#发送广播C++接收的源码.谢谢!
...全文
623
14
打赏
收藏
Socket发送和接收广播
通过以下方法发送广播C#语言能够正常接收,JAVA也能正常接收,C++无法接收(C++接收C++可以正常接收),请各位大虾帮忙解决,小弟不胜感激,最好能提供C#发送广播C++接收的源码.谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yuanpu10
2012-01-11
打赏
举报
回复
谢谢各位的支持 本问题已经解决确实是编码问题byte[] data = System.Text.Encoding.Unicode.GetBytes(stringData); 中Unicode改成UTF8搞定
yuanpu10
2012-01-11
打赏
举报
回复
[Quote=引用 10 楼 filwfqfe 的回复:]
先接受再初始化? 已经收到信息了你又清了,ret的返回值是0或者-1引用 9 楼 yuanpu10 的回复:
引用 8 楼 filwfqfe 的回复:
C/C++ code
receiveMessage() 中的 buf[ret] = '\0'; 什么意思?
代表初始化的意思啊,
[/Quote]
刚才DeBug结果中显示strVector 的结果是 a0b0c0通过编码后字符串C++获取有问题 不知道怎么解决
一叶之舟
2012-01-11
打赏
举报
回复
只要是UDP广播包,不管是什么语言都可以接收。
FILWFQFE
2012-01-11
打赏
举报
回复
先接受再初始化? 已经收到信息了你又清了,ret的返回值是0或者-1[Quote=引用 9 楼 yuanpu10 的回复:]
引用 8 楼 filwfqfe 的回复:
C/C++ code
receiveMessage() 中的 buf[ret] = '\0'; 什么意思?
代表初始化的意思啊,
[/Quote]
yuanpu10
2012-01-10
打赏
举报
回复
[Quote=引用 8 楼 filwfqfe 的回复:]
C/C++ code
receiveMessage() 中的 buf[ret] = '\0'; 什么意思?
[/Quote]
代表初始化的意思啊,
FILWFQFE
2012-01-10
打赏
举报
回复
receiveMessage() 中的 buf[ret] = '\0'; 什么意思?
Louistao
2012-01-10
打赏
举报
回复
java 和 C 解析字符顺序不同,是不是大端小端的问题?>
yuanpu10
2012-01-10
打赏
举报
回复
[Quote=引用 4 楼 priest334 的回复:]
估计是unicode和ansi编码的问题
[/Quote]
C++代码已贴出,请指点一下
yuanpu10
2012-01-10
打赏
举报
回复
#include "stdafx.h"
#include "Messaging.h"
#include "stdio.h"
#include "stdlib.h"
#include <atlstr.h> //解决CSString问题
#include <vector>
//#pragma comment(lib,"ws2_32.lib")//载入win32库
using namespace std;
void Messaging::buildSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
// 注册socket api
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
printf("\"socket\" wrong version! error code is %d\n", err);
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return;
}
// 创建socket
connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(INVALID_SOCKET == connect_socket)
{
err = WSAGetLastError();
printf("\"socket\" error! error code is %d\n", err);
return;
}
socketAddrLen = sizeof(SOCKADDR);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_BROADCAST;
sin.sin_port = htons(pubPort); //端口的设置
//设置该套接字为广播类型
bool bOpt = true;
setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
}
////绑定Socket
void Messaging::bindSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return;
}
memset(&localaddr,0,sizeof(localaddr));
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = 0;
localaddr.sin_port = htons(pubPort);
memset(&bcastaddr,0,sizeof(bcastaddr));
bcastaddr.sin_family = AF_INET;
bcastaddr.sin_addr.s_addr = INADDR_BROADCAST;
bcastaddr.sin_port = htons(pubPort);
sockfd = socket(AF_INET,SOCK_DGRAM,0);
bool opt = TRUE;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(const char*)&opt,sizeof(opt));
bind(sockfd,(sockaddr *)&localaddr,sizeof(localaddr));
castAddrLen = sizeof(bcastaddr);
}
//发送消息
void Messaging::sendMessage(char * message)
{
int nSendSize = sendto(connect_socket, message, strlen(message), 0, (SOCKADDR*)&sin, socketAddrLen);
if(SOCKET_ERROR == nSendSize)
{
err = WSAGetLastError();
printf("\"sendto\" error!, error code is %d\n", err);
}
printf("\tsend data: %s\n", message);
return;
}
//接收消息
vector<string> Messaging::receiveMessage()
{
char buf[1024]="";
vector<string> strVector;
int ret;
//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
ret = recvfrom(sockfd,buf,1024,0,(struct sockaddr*)&localaddr,&castAddrLen);
buf[ret] = '\0';
// printf("\tpacket data: %s\n", buf);
strVector= list.splitEx(buf,"|");
return strVector;
}
CString Messaging::convert2nd(const string &date,const string &time)
{
CString sec;
sec.Format("%s",date.c_str());
vector<string> v=list.splitEx(time,":");
int hh=atoi(v[0].c_str());
int mm=atoi(v[1].c_str());
int ss=atoi(v[2].c_str());
int sum=hh*3600+mm*60+ss;
CString sumsec;
sumsec.Format("%d",sum);
sec.Append(sumsec);
return sec;
}
priest334
2012-01-10
打赏
举报
回复
估计是unicode和ansi编码的问题
yuanpu10
2012-01-10
打赏
举报
回复
忘记说了 C++也能接收 只是只能接受一个字符 例如stringData="abc"; 接收只能接受字符a
yuanpu10
2012-01-10
打赏
举报
回复
按理来说C#代码是没错的 这个代码很简单,
yuanpu10
2012-01-10
打赏
举报
回复
//Socket发送广播
public void Send()
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //只能用UDP协议发送广播,所以ProtocolType设置为UDP
IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 5860);//255.255.255.255
IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("224.0.0.1"), 5860);
byte[] data = System.Text.Encoding.Unicode.GetBytes(stringData); //将发送内容转换为字节数组
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
sock.SendTo(data, iep1);
sock.SendTo(data, iep2);
sock.Close();
}
SOCKET
广播
包
接收
发送
介绍网络编程中
SOCKET
广播
包
接收
发送
arp
广播
发送
和
接收
linux程序
arp
广播
发送
的linux
发送
和
接收
程序,可以通过抓包工具抓包,
发送
的
广播
数据。
c# UDP组播的
发送
和
接收
(使用
socket
类)
使用
socket
类实现c# UDP组播的
发送
和
接收
;可以指定专门网卡
接收
消息;
对GCDAsyncUdp
Socket
的简单封装,作为
发送
和接受
广播
,一般UDP报文的接口
对GCDAsyncUdp
Socket
的简单封装,作为
发送
和接受
广播
,一般UDP报文的接口,专门处理udp的
发送
和接受,并且
广播
消息单独处理,便于管理
MFC下使用
Socket
实现
广播
通信
MFC下使用
Socket
实现
广播
通信,包含
发送
与
接收
模块,程序简单使用,在VS2015下编译通过,包含可执行程序,可以直接使用。
C++ 语言
64,643
社区成员
250,474
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章