linux 网络键盘,鼠标
2010-05-17 13:25
405 查看
因为公司的板子上键盘不好按,所以写个网络版的,方便调试。
client .c
server.c
client .c
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <linux/input.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> int connect_server(char * ipaddr, int myport) { int sockfd; struct hostent *he; struct sockaddr_in their_addr; if((he=gethostbyname(ipaddr))==NULL) { herror("gethostbyname"); return -1; } if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); return -1; } their_addr.sin_family = PF_INET; their_addr.sin_port = htons(myport); their_addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero),0); if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { perror("connect"); return -1; } return sockfd; } int main(void) { int fds[16] = {-1}; int fd_max = -1; char serverip[24] = {0}; int socketfd = -1; int ret = 0; struct input_event event_key; char input[5*1024] = {0}; int fd = open("/proc/bus/input/devices", O_RDWR); char dev[24] = "/dev/input/"; int len = read(fd, input, 5*1024); printf("len = %d /n", len); close(fd); char *p; p = input; int j = 0; strcpy(serverip, "192.168.168.114"); socketfd = connect_server(serverip, 7838); if(socketfd == -1) { printf("connect_server faild /n"); return -1; } struct timeval select_timeout; fd_set readfds; select_timeout.tv_sec= 4; select_timeout.tv_usec = 0; for(; p != NULL; j++) { p = strstr(p, "event"); if (p) { memcpy(dev+11, p, 6); printf("%s/n", dev); p+= 6; fds[j] = open(dev, O_RDWR); printf("fds[%d] = %d /n", j, fds[j]); if(fds[j] > fd_max) fd_max = fds[j]; memset(dev+11, 0, 8); } else break; } int i = 0; while(1) { FD_ZERO(&readfds); select_timeout.tv_sec= 2; select_timeout.tv_usec = 0; for(i=0; i<j; i++) { //printf("i= %d j = %d fds[i]=%d /n", i,j, fds[i]); FD_SET(fds[i], &readfds); } ret = select(fd_max + 1, &readfds, NULL, NULL, &select_timeout); printf("ret = %d/n", ret); if(ret > 0) { for(i=0; i<j; i++) { if ( FD_ISSET(fds[i], &readfds)) { printf("begin to read event %d/n", i); read(fds[i], &event_key, sizeof(struct input_event)); send(socketfd, &event_key, sizeof(struct input_event), 0); printf("key:type=%d, code=%d, value=%d/n",event_key.type, event_key.code, event_key.value); } } } else printf("select time out /n"); } for(i=0; i<j; i++) { close(fds[i]); } close(socketfd); return 0; }
server.c
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <linux/input.h> #include <fcntl.h> static void show_event(int fd, struct input_event* event) { //printf("%d %d %d/n", event->type, event->code, event->value); int ret = write(fd, event, sizeof(struct input_event)); // printf("fd = %d---%d %d %d ret = %d/n", fd, event->type, event->code, event->value, ret); } int main(int argc, char ** argv) { int sockfd,new_fd; /* 监听socket: sock_fd,数据传输socket: new_fd */ struct sockaddr_in my_addr; /* 本机地址信息 */ struct sockaddr_in their_addr; /* 客户地址信息 */ unsigned int sin_size, myport, lisnum; struct input_event event = {{0}, 0}; int fd_uinput = 2; int ret = 0; if(argv[1]) myport = atoi(argv[1]); else myport = 7838; if(argv[2]) lisnum = atoi(argv[2]); else lisnum = 2; // fd_uinput = open("/dev/uinput",O_RDWR); fd_uinput = open("/dev/input/event3",O_RDWR); if(fd_uinput<=0){ printf("error open uinput:/n"); return -1; } if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family=PF_INET; my_addr.sin_port=htons(myport); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero), 0); if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } if (listen(sockfd, lisnum) == -1) { perror("listen"); exit(1); } while(1) { sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { perror("accept"); continue; } while(1) { ret = recv(new_fd, &event, sizeof(event), 0) ; //printf("ret = %d /n", ret); if(ret <= 0) { break; } //write to uinput show_event(fd_uinput, &event); } close(new_fd); } close(fd_uinput); }
相关文章推荐
- Linux模拟鼠标和键盘事件的方法
- Linux 模拟 鼠标 键盘 事件
- linux下python之模拟鼠标键盘动作具体实现
- 如何在Linux下禁用键盘、触摸板、鼠标等输入设备
- Linux下鼠标和键盘的模拟控制
- 交互系统的构建之(二)Linux下鼠标和键盘的模拟控制
- Linux 虚拟鼠标,键盘
- linux下鼠标键盘按键的模拟
- Linux 虚拟鼠标,键盘
- 浅析linux下usb鼠标和usb键盘usbhid驱动hid_parse_report报告描述符解析
- win7系统连接蓝牙鼠标或键盘后无线网络总是掉线的原因及解决办法
- USB键盘和鼠标在linux下的支持方式(RH7.2)
- synergy-两台电脑共享一套鼠标键盘-Linux&windows详细教程
- 【Linux开发】【Qt开发】Qt界面键盘、触摸屏、鼠标的响应设置
- linux和windows共享鼠标键盘
- 应用网络串口软件远程控制电脑键盘鼠标
- 在Linux下禁用键盘、触摸板、鼠标等输入设备
- Linux2.6.34下 USB驱动(U盘\USB鼠标、键盘)
- 如何在 Linux 下锁住键盘和鼠标而不锁屏
- 在Linux下锁住键盘和鼠标而不锁屏