当前位置: 首页 > >

windows下同一台主机实现udp通信:结构体数据传输

发布时间:

程序代码开发环境为QT,在使用socket时,其工程文件XXXXX.pro中需添加以下代码:


利用udp发送数据时,可能会发送不同类型的数据,多种类型数据通过一条udp报文发送需要,因此需要建立一个结构体对需要发送的数据进行定义。但是udp发送的是char型参数,因此需要将结构体转换为char型。


LIBS += -lWS2_32

头文件:


//head.h
#ifndef HEAD_H
#define HEAD_H
int socket_recv(void);

typedef struct DATASENT
{
int i;
long tt;
double dv;
float fv;
unsigned int uiv;
}DATASENT;
#endif // HEAD_H

服务器端:


??? 发送时需要转换城char型


#include "head.h"
#include
#include


int main(int argc, char *argv[])
{
printf("Hello World!
");
socket_send();
return 0;
}

int socket_send(void){
printf("sendto starting...
");
//初始化socket
DWORD ver;
WSADATA WSAData;
//在调用WSAStartup要告知Windows要使用什么版本的socket

ver = MAKEWORD(1,1);

WSAStartup(ver,&WSAData); //Windows 要求,只要使用socket,第一步必须调用这个函数
//初始化socket完成

SOCKET st = socket(AF_INET,SOCK_DGRAM,0);//建立一个socket
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));//初始化addr

addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");

struct DATASENT data_sent;
memset(&data_sent,0,sizeof(DATASENT));
data_sent.i =6;
data_sent.tt = 4;
data_sent.dv = 1.23;
data_sent.fv = 0.50f;
data_sent.uiv = 2534;

char buf[1024]={0};
memcpy(&buf,&data_sent,sizeof(data_sent));
sendto(st,buf,sizeof(data_sent),0,(struct sockaddr *)&addr,sizeof(struct sockaddr));


closesocket(st);

WSACleanup();//释放win socket 的相关的资源
return 0;
}

客户端:


???? 要定义和发送方完全一致的结构体,并进行char到结构体的逆转换才能正确接收数据


#include "head.h"
#include
#include
int main(int argc, char *argv[])
{

socket_recv();
return 0;
}

int socket_recv(void){
struct DATASENT data_recv;

printf("recv before socket_recv starting...
");
//初始化socket
DWORD ver;
WSADATA WSAData;
//在调用WSAStartup要告知Windows要使用什么版本的socket
ver = MAKEWORD(1,1);
WSAStartup(ver,&WSAData); //Windows 要求,只要使用socket,第一步必须调用这个函数
//初始化socket完成

SOCKET st = socket(AF_INET,SOCK_DGRAM,0);//建立一个socket
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));//初始化addr
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(bind(st,(struct sockaddr *)&addr,sizeof(struct sockaddr))){
printf("bind error...
");
return -1;
} //当端口号和程序绑定
printf("recv before...
");
char buf[1024]={0};
struct sockaddr_in src_addr;
int len = sizeof(struct sockaddr);
memset(buf,0,sizeof(buf));
recvfrom(st,buf,sizeof(buf),0,(struct sockaddr *)&src_addr,&len);

memset(&data_recv,0,sizeof(DATASENT));
memcpy(&data_recv,&buf,sizeof(data_recv)+1);

printf("src_ip:%s
src_port:%d
",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port));

printf("dv:%2.2f,fv:%2.2f,i:%d,tt:%ld;uiv:%d
",data_recv.dv,data_recv.fv,data_recv.i,data_recv.tt,data_recv.uiv);


closesocket(st);
WSACleanup();//释放win socket 的相关的资源
return 0;
}

先运行客户端,再运行服务器端,其最终数据接收如图所示:




友情链接: