目前这部分代码会出现阻塞问题,暂时尚未解决

#include "udp.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h> #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include <arpa/inet.h> int PrintDiff(diff_t *diff)
{
printf("\n\n-----------------------\n");
printf("tow : %f\n", diff->tow);
printf("numBds: %d\n", diff->numBds);
printf("numGps: %d\n", diff->numGps);
printf("numGln: %d\n", diff->numGln);
int j;
printf("system: ");
for (j = ; j < MAXSAT; ++j)
{
printf("%d ", diff->system[j]);
}
printf("\n"); printf("PRN: ");
for (j = ; j < MAXSAT; ++j)
{
printf("%d ", diff->PRN[j]);
}
printf("\n"); printf("dDO: ");
for (j = ; j < MAXSAT; ++j)
{
printf("%f ", diff->dDO[j]);
}
printf("\n"); printf("dPR: ");
for (j = ; j < MAXSAT; ++j)
{
printf("%f ", diff->dPR[j]);
}
printf("\n"); printf("------------------------------------\n");
} int server_len;
int client_len; #define RECV_LOOP_COUNT 10
int recv_within_time(int fd, char *buf, size_t buf_n,struct sockaddr* addr,socklen_t *len,unsigned int sec,unsigned usec)
{
struct timeval tv;
fd_set readfds;
int i=;
unsigned int n=;
for(i=;i<RECV_LOOP_COUNT;i++)
{
FD_ZERO(&readfds);
FD_SET(fd,&readfds);
tv.tv_sec=sec;
tv.tv_usec=usec;
select(fd+,&readfds,NULL,NULL,&tv);
if(FD_ISSET(fd,&readfds))
{
if((n=recvfrom(fd,buf,buf_n,,addr,len))>=)
{
return n;
}
}
}
return -;
} int rover_sock_fd;/*套接字文件描述符*/
struct sockaddr_in addr_rover_server;
int UdpRoverInit(char *server_ip)
{
char SERVER_IP_ADDRESS[]="127.0.0.1";
strcpy(SERVER_IP_ADDRESS, server_ip); rover_sock_fd = socket(AF_INET,SOCK_DGRAM,);//创建套接子
//初始化服务器端地址
memset(&addr_rover_server,,sizeof(addr_rover_server));
addr_rover_server.sin_family = AF_INET;
addr_rover_server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);
addr_rover_server.sin_port = htons(SERVER_PORT); server_len = sizeof(struct sockaddr_in);
//printf("begin:\n");
return rover_sock_fd;
} int UdpRoverRecieve(diff_t *diff)
{
int recv_num, i=;
unsigned char recv_buf[MAX_LEN_ONCE];
unsigned char send_buf[MAX_LEN_ONCE]; unsigned char *_dest=malloc(sizeof(diff_t)+MAX_LEN_ONCE);
memset((void *)_dest,,sizeof(diff_t)+MAX_LEN_ONCE); //发送命令
memset(send_buf,,MAX_LEN_ONCE);
strcpy(send_buf,"\nrover_get\n");
//do
sendto(rover_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_rover_server,server_len);
usleep();
while()
{
recv_num = recv_within_time(rover_sock_fd,recv_buf,MAX_LEN_ONCE,(struct sockaddr *)&addr_rover_server,&server_len,,);
if (recv_num<MAX_LEN_ONCE)
{
continue;
}
if(strncmp(recv_buf,"\nserver_start\n",strlen("\nserver_start\n")))
{
putchar(recv_buf);
printf("@@%d\n", recv_num);
//return 1;
}
else{
printf("good\n");
break;}
} while() {
recv_within_time(rover_sock_fd,recv_buf,MAX_LEN_ONCE,(struct sockaddr *)&addr_rover_server,&server_len,,);
if (!strncmp(recv_buf,"\nserver_end\n",strlen("\nserver_end\n"))) break;
if (!strncmp("\nserver |",recv_buf,strlen("\nserver |")))
{
memcpy(_dest+i*(MAX_LEN_ONCE/),recv_buf+(MAX_LEN_ONCE/),MAX_LEN_ONCE/);
++i;
}
printf(".");
} printf("-------------%d------------\n", i);
if (i!=sizeof(diff_t)/(MAX_LEN_ONCE/)+)
{
printf("%d ,get wrong, will not update this time!\n", i);
}
else{
memcpy((void *)diff, _dest, sizeof(diff_t)+MAX_LEN_ONCE);
if ()
{
PrintDiff(diff);
}
} free(_dest);
UdpClose(rover_sock_fd);
return ;
} int station_sock_fd;
struct sockaddr_in addr_station_server;
int UdpStationInit(char *server_ip)
{
char SERVER_IP_ADDRESS[]="127.0.0.1";
strcpy(SERVER_IP_ADDRESS, server_ip); station_sock_fd = socket(AF_INET,SOCK_DGRAM,);//创建套接子
//初始化服务器端地址
memset(&addr_station_server,,sizeof(addr_station_server));
addr_station_server.sin_family = AF_INET;
addr_station_server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);
addr_station_server.sin_port = htons(SERVER_PORT); server_len = sizeof(struct sockaddr_in);
printf("begin send:\n"); return ;
}
int UdpStationSend(diff_t *diff)
{
int i=;
int send_num; unsigned char send_buf[MAX_LEN_ONCE];
unsigned char *src = (unsigned char *)diff; memset(send_buf,,MAX_LEN_ONCE);
strcpy(send_buf,"\nstation_start\n");
sendto(station_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_station_server,server_len); int j;
for (j = ; j < MAX_LEN_ONCE; ++j)
{
putchar(send_buf[j]);
} for(i=;i<sizeof(diff_t)/+;++i)
{
memset(send_buf,,MAX_LEN_ONCE);
strcpy(send_buf,"\nstation|");
memcpy(send_buf+,src+i*(MAX_LEN_ONCE/),MAX_LEN_ONCE/); for (j = ; j < MAX_LEN_ONCE; ++j)
{
putchar(send_buf[j]);
} send_num = sendto(station_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_station_server,server_len); usleep();
}
printf("---%d----%d----%d----%d----\n", i,sizeof(diff_t),MAX_LEN_ONCE/,sizeof(diff_t)/(MAX_LEN_ONCE/)); memset(send_buf,,MAX_LEN_ONCE);
strcpy(send_buf,"\nstation_end\n");
sendto(station_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_station_server,server_len); for (j = ; j < MAX_LEN_ONCE; ++j)
{
putchar(send_buf[j]);
} return ;
} int server_sock_fd; //套接子描述符号
struct sockaddr_in addr_server, addr_server_client;
int UdpServerInit()
{
int recv_num;
int send_num; char recv_buf[MAX_LEN_ONCE]; server_sock_fd = socket(AF_INET,SOCK_DGRAM,); if(server_sock_fd < ){
perror("client socket");
exit();
} else{
printf("client sock sucessful\n");
} memset(&addr_server,,sizeof(struct sockaddr_in));
addr_server.sin_family = AF_INET;//协议族
addr_server.sin_port = htons(SERVER_PORT);
addr_server.sin_addr.s_addr = htonl(INADDR_ANY);//任意本地址 client_len = sizeof(struct sockaddr_in); /*绑定套接字*/
if(bind(server_sock_fd,(struct sockaddr *)&addr_server,sizeof(struct sockaddr_in))< ){
perror("server bind");
return -;
} else{
printf("server bind sucess\n");
} return ;
} int UdpServerLoop(diff_t *diff, int arg)
{
int recv_num,send_num, i=;
unsigned char recv_buf[MAX_LEN_ONCE];
unsigned char send_buf[MAX_LEN_ONCE]; unsigned char *dest=malloc(sizeof(diff_t)+MAX_LEN_ONCE);
memset((void *)dest,,sizeof(diff_t)+MAX_LEN_ONCE); unsigned char *src = (unsigned char *)diff;
while()
{
//update diff data
recv_num = recvfrom(server_sock_fd,recv_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,&client_len);
int j;
if(recv_num < ) {
perror("recv_from");
return -;
} //update diff data
if (!strncmp(recv_buf,"\nstation_start\n",strlen("\nstation_start\n")))
{
i=;
while() {
recv_num = recvfrom(server_sock_fd,recv_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,&client_len);
if(recv_num < ) {
perror("recv_from");
return -;
} if (!strncmp(recv_buf,"\nstation_end\n",strlen("\nstation_end\n"))) break;
if (!strncmp("\nstation|",recv_buf,strlen("\nstation|")))
{
memcpy(dest+i*(MAX_LEN_ONCE/),recv_buf+(MAX_LEN_ONCE/),MAX_LEN_ONCE/);
++i;
}
//printf("recv sucessful\n"); } printf("-------------%d------------\n", i);
if (i!=sizeof(diff_t)/(MAX_LEN_ONCE/)+)
{
printf("get wrong, will not update this time!\n");
}
else{
memcpy((void *)diff, dest, sizeof(diff_t)+MAX_LEN_ONCE);
if (arg)
{
PrintDiff(diff);
}
} } //send diff data
if(!strncmp(recv_buf,"\nrover_get\n",strlen("\nrover_get\n")))
{
memset(send_buf,,MAX_LEN_ONCE);
strcpy(send_buf,"\nserver_start\n");
sendto(server_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,client_len); //以后要防溢出s
for(i=;i<sizeof(diff_t)/(MAX_LEN_ONCE/)+;++i)
{
strcpy(send_buf,"\nserver |");
memcpy(send_buf+(MAX_LEN_ONCE/),src+i*(MAX_LEN_ONCE/),MAX_LEN_ONCE/);
send_num = sendto(server_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,client_len);
if(send_num < ){
perror("sendto");
return -;
} }
memset(send_buf,,MAX_LEN_ONCE);
strcpy(send_buf,"\nserver_end\n");
sendto(server_sock_fd,send_buf,MAX_LEN_ONCE,,(struct sockaddr *)&addr_server_client,client_len);
}
}
return ;
} int UdpClose(int sock_fd)
{
close(sock_fd);
return ;
}

linux网络编程笔记——UDP的更多相关文章

  1. Linux网络编程笔记(修订版)

    我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1.   基本概念 2.   基本接口 2.1.   打开一个socket 2.2.   将 ...

  2. Linux网络编程:UDP Socket编程范例

    TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...

  3. python-socket网络编程笔记(UDP+TCP)

    端口 在linux系统中,有65536(2的16次方)个端口,分为: 知名端口(Well Known Ports):0-1023,如80端口分配给HTTP服务,21端口分配给FTP服务. 动态端口(D ...

  4. linux网络编程笔记——TCP

    1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直 ...

  5. Linux网络编程:UDP实现可靠的文件传输

    我们知道,用TCP实现文件传输很简单.相对于TCP,因为UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方 ...

  6. Linux 网络编程(UDP)

    客户端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/sock ...

  7. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  8. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  9. Linux网络编程10——使用UDP实现五子棋对战

    思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...

随机推荐

  1. C++:运算符重载函数之成员运算符重载函数

    5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式 ...

  2. 简化PHP开发的10个工具

    本文介绍了可以帮助简化 PHP 开发的11个项目,包括框架,类库,工具,代码. 1. CakePHP Development Framework CakePHP 是一个 PHP 的快速开发框架.它提供 ...

  3. ActiveMQ 集群(1)

    Queue consumer clusters(消费者集群): 简介: 同一个queue,如果一个消费者失效, 那么任何未经确认的消息将会被发送给queue上的其它消费者.如果一个消费者比其它消费者执 ...

  4. 车牌识别LPR系统系列文章汇总

    这里的LPR的的几篇文章是之前项目的一些相关资料的整理,涉及实验室内部的资料就没有放上来,希望能对想了解这方面的同学,有所帮助,那怕了解个大概也好.知道整体的思路就好.当初就是一个人瞎摸索,走了很多的 ...

  5. fedora如何设置上网

    设置方法如下:第一步:激活网卡.Fedora Linux系统装好后默认的网卡是eth0,用下面的命令将这块网卡激活.# ifconfig eth0 up.第二步:设置网卡进入系统时启动 .想要每次开机 ...

  6. Struts2的简单案例

    第一步:首先下载struts2的架包(链接地址:http://download.csdn.net/detail/ahy1024/4626028) 第二步:新建web project项目 DemoStr ...

  7. Mybatis中配置Mapper的方法

    在这篇文章中我主要想讲一下Mybatis配置文件中mappers元素的配置.关于基础部分的内容可以参考http://haohaoxuexi.iteye.com/blog/1333271. 我们知道在M ...

  8. cmd打开git

    一旦你的git安装成功,而且在安装是没有选择可以使用cmd黑窗口来打开,那么你再来设置会很麻烦,我表示不会. 今天分享下同事分享给我的一个不错的方法. 这个方法依赖一个 Dos 文件(.bat文件), ...

  9. Java与正则表达式

    Java与正则表达式 标签: Java基础 正则 正如正则的名字所显示的是描述了一个规则, 通过这个规则去匹配字符串. 学习正则就是学习正则表达式的语法规则 正则语法 普通字符 字母, 数字, 汉字, ...

  10. Jqgrid入门-使用模态对话框编辑表格数据(三)

            Jqgrid是一个强大的表格插件,它提供了多种方式来编辑数据.这三种方式分别是: Cell Editing——只允许修改某一个单元格内容 Inline Editing——允许在jqGr ...