问题:网络通信中所有数据都是以字节的形式传输,所以在传送数字的时候需要将其化为字节形式
单精度浮点型是四个字节
UDP服务端
//服务器
#include< stdio.h >
#include< string.h >
#include< winsock.h >
#include< windows.h >
#include <iostream>
#pragma comment( lib, "ws2_32.lib" )
#define PORT 2046
#define BACKLOG 10
#define TRUE 1
#define MAXDATASIZE 1000
using namespace std;
float ByteToFloat(char* byteArray)
{
return *((float*)byteArray);
}
void main(void)
{
int iServerSock;
// int iClientSock;
int addr_len;
int numbytes;
char buf[MAXDATASIZE];
struct sockaddr_in ServerAddr;
struct sockaddr_in ClientAddr;
WSADATA WSAData;
if (WSAStartup(MAKEWORD(1, 1), &WSAData))
{
printf("initializationing error!\n");
WSACleanup();
exit(0);
}
iServerSock = socket(AF_INET, SOCK_DGRAM, 0);
if (iServerSock == INVALID_SOCKET)
{
printf("创建套接字失败!\n");
WSACleanup();
exit(0);
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(PORT);//监视的端口号
ServerAddr.sin_addr.s_addr = INADDR_ANY;//本地IP
memset(&(ServerAddr.sin_zero), 0, sizeof(ServerAddr.sin_zero));
if (bind(iServerSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr)) == -1)
{
printf("bind调用失败!\n");
WSACleanup();
exit(0);
}
while (1) {
addr_len = sizeof(struct sockaddr);
numbytes = recvfrom(iServerSock, buf, MAXDATASIZE, 0, (struct sockaddr *) & ClientAddr, &addr_len);
if (numbytes == -1)
{
printf("recvfrom调用失败!\n");
WSACleanup();
exit(0);
}
printf("got packet from %s\n", inet_ntoa(ClientAddr.sin_addr));
printf("packet is %d bytes long\n", numbytes);
buf[numbytes] = '\0';
//float aa = *((float*)buf);
float aa, bb = 0, cc = 0;
char buf1[4], buf2[4];
//bb = *((float*)buf);
memcpy(&aa, &buf , 4);
/*
for (int i = 0; i < 4; i++)
{
buf1[i] = buf[4 + i];
buf2[i] = buf[8 + i];
}
*/
memcpy(buf1, buf + 4, 4);
memcpy(buf2, buf + 8, 4);
bb = ByteToFloat(buf1);
cc = ByteToFloat(buf2);
//memcpy(&bb, &buf1, 4);
//memcpy(&cc, &buf2, 4);
printf("packet contains \"aa = %f bb = %f cc = %f buf = %s\"\n", aa, bb, cc, buf);
}
closesocket(iServerSock);
WSACleanup();
}
UDP客户端
#include< stdio.h >
#include< stdlib.h >
#include< windows.h >
#include< winsock.h >
#include< string.h >
#include <iostream>
#pragma comment( lib, "ws2_32.lib" )
#define PORT 2046
#define MAXDATASIZE 100
using namespace std;
void main(void)
{
int iClientSock;
struct sockaddr_in ServerAddr;
int numbytes;
WSADATA WSAData;
if (WSAStartup(MAKEWORD(1, 1), &WSAData))
{
printf("initializationing error!\n");
WSACleanup();
exit(0);
}
if ((iClientSock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("创建套接字失败!\n");
WSACleanup();
exit(0);
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(PORT);
ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(&(ServerAddr.sin_zero), 0, sizeof(ServerAddr.sin_zero));
while (1)
{
float buf;
cin >> buf ;
char farray[12], longitude[4], latitude[4], altitude[4];
memcpy(farray, &buf, sizeof(buf));
cin >> buf;
memcpy(latitude, &buf, sizeof(buf));
cin >> buf;
memcpy(altitude, &buf, sizeof(buf));
for (int i = 0; i < 4; i++)
{
farray[4 + i] = latitude[i];
farray[8 + i] = altitude[i];
}
numbytes = sendto(iClientSock, farray, sizeof(farray), 0, (struct sockaddr *) & ServerAddr, sizeof(struct sockaddr));
}
if (numbytes == -1)
{
printf("sendto调用失败!\n");
WSACleanup();
exit(0);
}
printf("sent %d bytes to %s\n", numbytes, inet_ntoa(ServerAddr.sin_addr));
closesocket(iClientSock);
WSACleanup();
}
float转byte
char farray[4];
*(float*)farray = buf;//强制类型转换
or
memcpy(farray, &buf, sizeof(buf));//使用memcpy
byte转float
float aa;
aa = *((float*)buf)
or
memcpy(&aa, &buf, 4);
还有一种方法,使用共同体转换