linux网络编程笔记——UDP
目前这部分代码会出现阻塞问题,暂时尚未解决
- #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的更多相关文章
- Linux网络编程笔记(修订版)
我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1. 基本概念 2. 基本接口 2.1. 打开一个socket 2.2. 将 ...
- Linux网络编程:UDP Socket编程范例
TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...
- python-socket网络编程笔记(UDP+TCP)
端口 在linux系统中,有65536(2的16次方)个端口,分为: 知名端口(Well Known Ports):0-1023,如80端口分配给HTTP服务,21端口分配给FTP服务. 动态端口(D ...
- linux网络编程笔记——TCP
1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直 ...
- Linux网络编程:UDP实现可靠的文件传输
我们知道,用TCP实现文件传输很简单.相对于TCP,因为UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方 ...
- Linux 网络编程(UDP)
客户端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/sock ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- Linux网络编程10——使用UDP实现五子棋对战
思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...
随机推荐
- 248. Strobogrammatic Number III
题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...
- 246. Strobogrammatic Number
题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...
- C++仿函数(functor)详解
C++仿函数(functor)详解 所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类. 因此,这里需要明确两点: 1 仿函数不是函数,它是个类: 2 仿函数重载了()运算符,使得它 ...
- 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍
转自:http://blog.csdn.net/carson2005/article/details/7647500 TLD(Tracking-Learning-Detection)是英国萨里大学的一 ...
- ubuntu install rpm package
Using command 'alien' instead of 'rpm'. sudo apt-get install alien alien -i tst.rpm 'man alien' for ...
- orzdba在5.6安装
前言:淘宝的orzdba查看MySQL服务器当前QPS,TPS很方便,但是不少人反应,在5.6原本好用的工具不好用了,频繁出现这样警告: Warning: Using a password on th ...
- 加密解密(11)HMAC-在sha1,md5基础上加密
HMAC: Hash-based Message Authentication Code http://baike.sogou.com/v10977193.htm http://www.baike.c ...
- BZOJ 3132 上帝造题的七分钟(二维树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3132 题意:给出一个矩阵,两种操作:(1)将某个子矩阵的数字统一加上某个值:(2)查询某 ...
- python 字符串换行的三种方式
if __name__ == '__main__': #第一种: 三个单引号 print ''' aaaaaaaaaaaaaaaa bbbbbbbbbbbbbb''' #第二种: 三个 ...
- zlib代码生成
1.主页下载zlib-1.2.8的source code的压缩包:F:\Develop Tools\zlib-1.2.8 2.下载安装cmake-2.8.1-win32-x86 3.用cmake生成z ...