UDP如何发送浮点数组?
我想用sendto发送一个大浮点数组给其他机器。下面代码是发送字符的。
请问在下面这个小程序中怎么改一下能发float或double的东西?
谢谢。
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr( "127.0.0.1 ");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6117);
sendto(sockClient, "hello,patrick ",strlen( "hello patrick ")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
[解决办法]
任何大浮点数组都可以用字符char代替,而发送过后,你的协议定义成什么样子,就在接收时转化过来就行了。
[解决办法]
sprintf
[解决办法]
用结构体吧
[解决办法]
1。把浮点数用memcpy,copy到字符串中发送,接收方再memcpy到float中
2. 直接用sprintf(s, "%f ",f)到字符s中,接收方atof(s)即可
[解决办法]
memcpy比较好,效率高,占用字节少,不需函数转换
[解决办法]
//float数组100个元素,并初始化值
float f[100];
for(int i=0;i <sizeof(f)/sizeof(float);i++)
{
f[i]=1.4+i;
TRACE( "index=%d,%f\n ",i,f[i]);
}
//分配待发送的包,第一个字节存放数组个数,实际情况可能需要更多字节
BYTE *pBytes=new BYTE[sizeof(f)+1];
pBytes[0]=(BYTE)(sizeof(f)/sizeof(float));
//填充缓冲区
memmove(pBytes+1,(BYTE *)f,sizeof(f));
//发送缓冲区
sendto(sockClient,pBytes,sizeof(f)+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//接受方,取得数组元素个数
int x=(int)pBytes[0];
//转换为float 指针
float *f2=(float *)(pBytes+1);
//按照大小输出
for(i=0;i <x;i++)
{
TRACE( "index=%d,%f\n ",i,*(f2+i));
}
delete [] pBytes;