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!\n");
    socket_send();
    return 0;
}

int socket_send(void){
    printf("sendto starting...\n");
    //初始化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...\n");
    //初始化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...\n");
        return -1;
    } //当端口号和程序绑定
    printf("recv before...\n");
    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\n src_port:%d\n",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port));

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


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

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

windows下同一台主机实现udp通信:结构体数据传输_第1张图片

你可能感兴趣的:(c/c++)