社区
C++ 语言
帖子详情
Socket发送和接收广播
yuanpu10
2012-01-10 02:37:51
通过以下方法发送广播C#语言能够正常接收,JAVA也能正常接收,C++无法接收(C++接收C++可以正常接收),请各位大虾帮忙解决,小弟不胜感激,最好能提供C#发送广播C++接收的源码.谢谢!
...全文
640
14
打赏
收藏
Socket发送和接收广播
通过以下方法发送广播C#语言能够正常接收,JAVA也能正常接收,C++无法接收(C++接收C++可以正常接收),请各位大虾帮忙解决,小弟不胜感激,最好能提供C#发送广播C++接收的源码.谢谢!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
广播
包
接收
发送
c# UDP组播的
发送
和
接收
(使用
socket
类)
使用
socket
类实现c# UDP组播的
发送
和
接收
;可以指定专门网卡
接收
消息;
对GCDAsyncUdp
Socket
的简单封装,作为
发送
和接受
广播
,一般UDP报文的接口
对GCDAsyncUdp
Socket
的简单封装,作为
发送
和接受
广播
,一般UDP报文的接口,专门处理udp的
发送
和接受,并且
广播
消息单独处理,便于管理
Socket
广播
源码
Socket
(UDP)方式实现
广播
发送
功能,下载后可看到server(
发送
端)和client(
接收
端)两个小项目, 用VS2010可直接打开。如果没VS2010直接复制Program类中方法即可
python基于
socket
实现网络
广播
的方法
主要介绍了python基于
socket
实现网络
广播
的方法,涉及Python操作
socket
的相关技巧,非常具有实用价值,需要的朋友可以参考下
C++ 语言
65,199
社区成员
250,520
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章