您的位置:首页 > 理论基础 > 计算机网络

linux 网络键盘,鼠标

2010-05-17 13:25 405 查看
因为公司的板子上键盘不好按,所以写个网络版的,方便调试。



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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: