Linux下的udp广播与接收程序 包含序列号
发布时间: 2013-01-21 10:15:39 作者: rapoo
Linux下的udp广播与接收程序 包含序列号
#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#include<fcntl.h>#include<unistd.h>#include <errno.h> #define RECV_NO 250typedef struct sockaddr ADDR;int main(int argc, char *argv[]){ssize_t n;char buf[2];int k=0,serverfd,nread=0;struct sockaddr_in myaddr,peeraddr;struct timeval tv;FILE * fp; extern int errno; char file[]="handle_delay_test1_recv.txt"; struct Record { time_t sec; suseconds_t usec; };struct Record record[RECV_NO+1];if(argc < 1){printf("the usage :%s",argv[0]);//printf("the usage :%s ip port",argv[0]);exit(-1);}if((serverfd = socket(PF_INET,SOCK_DGRAM,0)) < 0){perror("fail t socket");exit(-1);}myaddr.sin_family = PF_INET;myaddr.sin_port =htons(5555);//绑定端口监听myaddr.sin_addr.s_addr = INADDR_ANY;//系统会自动填入本机IP地址。 if(bind(serverfd,(ADDR *)&myaddr ,sizeof(myaddr)) < 0){perror("fail to bind");exit(-1);}socklen_t peerlen = sizeof(peeraddr);while(k<RECV_NO){//nread为输出字符的实际长度,buff是读缓冲。if(0<recvfrom(serverfd,buf,2,0,(ADDR *)&peeraddr,&peerlen)) {gettimeofday(&tv,NULL); printf(" %d time %ld:%ld\n",k+1,tv.tv_sec,tv.tv_usec);record[k].sec=tv.tv_sec;record[k++].usec=tv.tv_usec;}}close(serverfd); fp=fopen(file,"a+"); if(fp==NULL) { printf("cant't open file %s.\n",file); printf("errno:%d\n",errno); printf("ERR :%s\n",strerror(errno)); return; } else { printf("%s was opened.\n",file); } for(k=0;k<RECV_NO;k++)fprintf(fp,"%d time %ld:%ld\n",k+1,record[k].sec,record[k].usec);fprintf(fp,"\n");//分开每组数据printf("%d records was written into %s.\n",k,file);fclose(fp);return 0 ;}