您的位置:首页 > 其它

利用UDP传输结构体数据 structdata over udp

2015-11-24 15:15 585 查看

利用UDP传输结构体数据

客户端程序

/*************************************************

Copyright (C),

File name: structdata_udp_client.c

Author:lepton126

Version:

Date: 2015-11

Description:test

*************************************************/

#include <sys/types.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/shm.h>

#include <arpa/inet.h>

#include <fcntl.h>

#define MYPORT 8866

#define BUFFER_SIZE 1024

typedef struct

{

int ab;

int num[1000000];

}Node;

int main(int argc,char *argv[])

{

int client_addr,i;

struct sockaddr_in server_addr;

struct hostent *host;

if(argc != 3)

{

printf("Usage:%s server_ip server_port\n",argv[0]);

exit(1);

}

host=gethostbyname(argv[1]);

client_addr=socket(AF_INET,SOCK_DGRAM,0);

if(client_addr<0)

{

printf("Socket Error:%s\n",strerror(errno));

exit(1);

}

bzero(&server_addr,sizeof(struct sockaddr_in));

server_addr.sin_family=AF_INET;

server_addr.sin_port=htons(MYPORT);

server_addr.sin_addr=*((struct in_addr *)host->h_addr);

Node *myNode=(Node *)malloc(sizeof(Node));

myNode->ab=123;

for(i=0;i<1000000;i=i+1)

{

myNode->num[i]=i;

printf("myNode->num[%d]=%d\n",i,i);

}

//sleep(10000);

int needSend=sizeof(Node);

printf("needSend=%d\n",needSend);

char *buffer=(char *)malloc(needSend);

memcpy(buffer,myNode,needSend);

int pos=0;

int len=0;

while(pos<needSend)

{

len=sendto(client_addr,buffer+pos,BUFFER_SIZE,0,(struct sockaddr *)&server_addr,sizeof(struct sockaddr));

//printf("len=%d\n",len);

if(len <= 0)

{

perror("ERROR");

break;

}

pos+=len;

}

free(buffer);

free(myNode);

close(client_addr);

printf("Send over !!!\n");

return 0;

}

服务端程序

/*************************************************

Copyright (C),

File name: structdata_udp_server.c

Author:lepton126

Version:

Date: 2015-11

Description:test

*************************************************/

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <string.h>

#include <sys/msg.h>

#define MYPORT 8866

#define BUFFER_SIZE 1024

typedef struct

{

int ab;

int num[1000000];

}Node;

int main(void)

{

int sockfd,i;

char temp[20]={0};

int addrlen;

struct sockaddr_in server_addr;

struct sockaddr_in client_addr;

sockfd=socket(AF_INET,SOCK_DGRAM,0);

if(sockfd<0)

{

printf("Socket Error:%s\n",strerror(errno));

exit(1);

}

bzero(&server_addr,sizeof(struct sockaddr_in));

server_addr.sin_family=AF_INET;

server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

server_addr.sin_port=htons(MYPORT);

if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))<0)

{

printf("Bind Error:%s\n",strerror(errno));

exit(1);

}

addrlen=sizeof(struct sockaddr);

printf("The server is waiting datas:\n");

while(1)

{

Node *myNode=(Node *)malloc(sizeof(Node));

int needRecv=sizeof(Node);

char *buffer=(char *)malloc(needRecv);

int pos=0;

int len;

while(pos < needRecv)

{

len=recvfrom(sockfd,buffer+pos,BUFFER_SIZE,0,(struct sockaddr *)&client_addr,&addrlen);

if(len<0)

{

printf("Server Receive Data Failed !\n");

break;

}

pos+=len;

}

memcpy(myNode,buffer,needRecv);

printf("ab=%d\n",myNode->ab);

//检查是否已对num数组赋值,若赋值,则打印输出

for(i=0;i<1000000;i=i+1)

{

sprintf(temp,"%d",myNode->num[i]);

if(strcmp(temp,"0")!=0)

{

printf("myNode->num[%d]=%d\n",i,myNode->num[i]);

}

}

free(buffer);

free(myNode);

}

close(sockfd);

return 0;

}

说明

服务器程序和客户端程序均运行在centos6,主要目的是用于测试在linux环境下,利用udp协议传输结构体数据的可行性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: