irdaspray.c
来自「linux操作系统下的红外驱动的测试程序」· C语言 代码 · 共 303 行
C
303 行
/********************************************************************* * * Filename: irdaspray.c * Version: * Description: * Status: Experimental. * Author: Dag Brattli <dagb@cs.uit.no> * Created at: Mon May 10 10:12:55 1999 * Modified at: Wed Jan 19 18:06:30 2000 * Modified by: Dag Brattli <dagb@cs.uit.no> * * Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * ********************************************************************/#include <sys/socket.h>#include <sys/types.h>#include <sys/time.h>#include <sys/ioctl.h>#include <sys/stat.h>#include <sys/wait.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <string.h>#include <fcntl.h>#include <errno.h>#include <irda.h>#ifndef AF_IRDA#define AF_IRDA 23#endif /* AF_IRDA */#define MAX_DEVICES 10int fd;int mtu = 0;int frame_size = 1024;int frame_number = 100;unsigned char buf[4096];int delay = 0;int echo = 0; /* Use discard service by default *//* * Function echo_discover_devices (fd) * * Try to discover some remote device(s) that we can connect to * */int irdaspray_discover_devices(int fd){ struct irda_device_list *list; unsigned char *buf; int len; int i; len = sizeof(struct irda_device_list) + sizeof(struct irda_device_info) * MAX_DEVICES; buf = malloc(len); list = (struct irda_device_list *) buf; if (getsockopt(fd, SOL_IRLMP, IRLMP_ENUMDEVICES, buf, &len)) { perror("getsockopt"); exit(-1); } if (len > 0) { printf("Discovered: (list len=%d)\n", list->len); for (i=0;i<list->len;i++) { printf(" name: %s\n", list->dev[i].info); printf(" daddr: %08x\n", list->dev[i].daddr); printf(" saddr: %08x\n", list->dev[i].saddr); printf("\n"); if (list->dev[i].hints[0] & HINT_COMPUTER) { printf("Lets try this one\n"); return list->dev[i].daddr; } } } printf("Didn't find any devices!\n"); return -1;}/* * Function irdaspray_connect_request (self) * * Try to connect to remote device * */static int irdaspray_connect_request(int fd){ struct sockaddr_irda peer; int len = sizeof(int); int daddr; /* * Open TTP connection to remote device! */ daddr = irdaspray_discover_devices(fd); if (daddr == -1) return -1; /* Disable IrTTP SAR */ if (setsockopt(fd, SOL_IRLMP, IRTTP_MAX_SDU_SIZE, &mtu, sizeof(mtu))) { perror("setsockopt"); exit(-1); } peer.sir_family = AF_IRDA; if (echo) strncpy(peer.sir_name, "IrECHO", 25); else strncpy(peer.sir_name, "IrDISCARD", 25); peer.sir_addr = daddr; if (connect(fd, (struct sockaddr*) &peer, sizeof(struct sockaddr_irda))) { perror("connect"); return -1; } /* Check what the IrLAP data size is */ if (getsockopt(fd, SOL_IRLMP, IRTTP_MAX_SDU_SIZE, (void *) &mtu, &len)) { perror("getsockopt"); exit(-1); } /* printf(__FUNCTION__ "(), link mtu=%d\n", mtu); */ return 0;}int irdaspray_transmit(int fd){ int total = 0; int actual; int i; /* Transmit frames */ for (i=0; i<frame_number; i++) { actual = send(fd, buf, frame_size, 0); total += actual; } return total;}int irdaspray_receive(int fd){ int total = 0; int actual; int i; /* Receive frames */ for (i=0; i<frame_number; i++) { actual = recv(fd, buf, sizeof(buf), 0); total += actual; } return total;}static void usage(char *argv[]){ fprintf(stderr, "usage: %s [-v] [-e] [-h] [-b frame-size] [-n frames] [-f file] [device]\n", argv[0]); fprintf(stderr, " -v verbose\n"); fprintf(stderr, " -e use echo service for full duplex transfer\n"); fprintf(stderr, " -h print this message\n"); fprintf(stderr, " -s frame-size in bytes (default 1024)\n"); fprintf(stderr, " -n number of frames (default 100)\n"); fprintf(stderr, " -f file to preload buffer (zero buffer by default)\n"); fprintf(stderr, " -d inter-buffer transmission delay in usecs (default 0)\n"); exit(1);}/* * Function main (argc, ) * * * */int main(int argc, char *argv[]){ struct timeval start, end; int total; double time; int status; int ret; int c; int pid = 0; while ((c = getopt(argc, argv, "vehs:m:n:f:d:")) != -1) { switch (c) { case 'm': mtu = atoi(optarg); break; case 'e': echo = 1; /* Use echo service instead of discard */ break; case 'h': usage(argv); break; case 'n': frame_number = atoi(optarg); break; case 's': frame_size = atoi(optarg); break; /* case 'f': *//* fflag = TRUE; *//* if ((infile = fopen(optarg, "r")) == NULL) { *//* fprintf(stderr, "%s: Can't open file %s.\n", argv[0], optarg); *//* exit(2); *//* } *//* break; */ case 'd': delay = atoi(optarg); break; default: usage(argv); break; } } /* Create socket */ fd = socket(AF_IRDA, SOCK_STREAM, 0); if (fd < 0) { perror("socket"); exit(-1); } /* Try connect */ ret = irdaspray_connect_request(fd); if (ret) { return -1; } printf("Connected!\n"); gettimeofday(&start, (struct timezone*) 0); if (echo) { /* Fork off receiver */ pid = fork(); if (pid) { total = irdaspray_receive(fd); } else { total = irdaspray_transmit(fd); } } else total = irdaspray_transmit(fd); gettimeofday(&end, (struct timezone*) 0); time = (double) (end.tv_sec - start.tv_sec) + (double) ((double) (end.tv_usec - start.tv_usec) / 1000000.0); if (pid) printf("Received %d bytes in %f seconds (%0.3f kbytes/s)\n", total, time, (double) (total / time) / 1024); else { if (echo) wait(&status); printf("Transmitted %d bytes in %f seconds (%0.3f kbytes/s)\n", total, time, (double) (total / time) / 1024); } return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?