利用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协议传输结构体数据的可行性。相关文章推荐
- schema文件中cube的事实表使用视图方法
- PHP 数组和对象的相互转化
- js防xss注入
- div距页面顶部有间隙
- 使用android SpannableStringBuilder实现图文混排源码
- 使用 Screen 创建并管理多个 shell
- SVG 在线编辑器
- Oracle之常用FAQ--备份与恢复
- [Rman]使用RMAN的Compressed Backupsets备份压缩技术
- 在线强制查看摄像头视频
- 改变页面状态码
- 谷歌官方SwipeRefreshLayout下拉刷新的用法。
- Mysql中文汉字转拼音的实现(每个汉字转换全拼)
- woocommerce自定义产品排序(无需改动代码,适合产品数量少的情况)
- if(self = (super init))的理解
- wtm32f10xx时钟系统
- 使用C++自定义Binder
- Java游戏服务器-Netty自动重连与会话管理
- Oracle之常用FAQ--Oracle 构架体系
- AirPlay无线技术研究