Socket发送和接收广播

yuanpu10 2012-01-10 02:37:51
通过以下方法发送广播C#语言能够正常接收,JAVA也能正常接收,C++无法接收(C++接收C++可以正常接收),请各位大虾帮忙解决,小弟不胜感激,最好能提供C#发送广播C++接收的源码.谢谢!
...全文
623 14 打赏 收藏 转发到动态 举报
写回复
用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();
}

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧