Skip to content

Commit

Permalink
server optimized & clients data format changed & done some testing
Browse files Browse the repository at this point in the history
  • Loading branch information
nmelihsensoy committed Feb 13, 2019
1 parent f71a1ce commit 6afd4c5
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 109 deletions.
91 changes: 44 additions & 47 deletions clients/C_Cpp/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@
* Input Event codes can be found here
* https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h
*
* 0 - Key Report
* 1 - Key Press - Any device
* 2 - Mouse Pointer
*
* Ex:
* Left Click Event -> 11272 -> 1:key press, 1: press val, 272: keycode
* X Axis -> 20010 -> 2: pointer, 0: x axis, 010: +10
* Y Axis -> 21-10 -> 2: pointer, 1: y axis, -10: -10
*
*/

#include <stdio.h> //printf
Expand All @@ -22,6 +31,38 @@ int main(int argc, char **argv){

int sock = 0;
struct sockaddr_in serv_addr;
char* server_address = "127.0.0.1";

int mode = 0;
int element = 0;
int val = 0;
char payload[6];
// Arguments Handling
for (int i = 1; i < argc; i++){
if((strcmp(argv[i], "-ip") == 0) || (strcmp(argv[i], "--ipaddress") == 0)){
server_address = argv[i+1];
}else if((strcmp(argv[i], "-k") == 0) || (strcmp(argv[i], "--keypress") == 0)){
mode = 3;
element = i;
}else if((strcmp(argv[i], "-pX") == 0) || (strcmp(argv[i], "--pointerX") == 0)){
mode = 2;
element = i;
val = 0;
}else if((strcmp(argv[i], "-pY") == 0) || (strcmp(argv[i], "--pointerY") == 0)){
mode = 2;
element = i;
val = 1;
}else if((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)){
printf("Virtual HID Socket Client\n");
printf(" Usage: client -k 115 \n");
printf("Available Commands: \n");
printf(" -ip / --ipaddress : Server ip address(Default: 127.0.0.1)");
printf(" -h / --help : Show help\n");
printf(" -k / --keypress [value]: Sends key press event over socket\n");
printf(" -pX / --pointerX: Sends X axis coordinates over socket\n");
printf(" -pY / --pointerY [value]: Sends Y axis coordinates over socket\n");
}
}

if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("Socket creation error \n");
Expand All @@ -34,7 +75,7 @@ int main(int argc, char **argv){
serv_addr.sin_port = htons(PORT);

// Convert IPv4 and IPv6 addresses from text to binary form
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0){
if(inet_pton(AF_INET, server_address, &serv_addr.sin_addr)<=0){
printf("\nInvalid address/ Address not supported \n");
exit(EXIT_FAILURE);
}
Expand All @@ -44,55 +85,11 @@ int main(int argc, char **argv){
exit(EXIT_FAILURE);
}

char mode = '0';
int element = 0;
// Arguments Handling
for (int i = 1; i < argc; i++){
if((strcmp(argv[i], "-k") == 0) || (strcmp(argv[i], "--keyboard") == 0)){
mode = '1';
element = i;
}else if((strcmp(argv[i], "-m") == 0) || (strcmp(argv[i], "--mouse") == 0)){
mode = '2';
element = i;
}else if((strcmp(argv[i], "-mb") == 0) || (strcmp(argv[i], "--mousebutton") == 0)){
mode = '3';
element = i;
}else if((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)){
printf("Virtual HID Socket Client\n");
printf(" Usage: client -k 115 \n");
printf("Available Commands: \n");
printf(" -h / --help : Show help\n");
printf(" -k / --keyboard [code]: Sends keyboard event over socket\n");
printf(" -m / --mouse [X] [Y]: Sends mouse pointer coordinates over socket\n");
printf(" -mb / --mousebutton [code]: Sends mouse button press over socket\n");
}
}

int arg_size = strlen(argv[element+1]);
char *payload = malloc(arg_size);
int payload_size = arg_size+1;
*(payload+0) = mode; // set payloads first element as a id
for(int i=0; i<arg_size; i++){
payload[i+1] = *(argv[element+1]+i);
}

if(mode=='2'){
int arg2_size = strlen(argv[element+2]);
payload_size = arg_size+arg2_size+2;
payload = realloc(payload, payload_size);

*(payload+arg_size+1) = ':';
for(int i=arg_size+2; i<=payload_size; i++){
payload[i] = *(argv[element+2]+i-arg_size-2);
}
}

//printf("%s", payload);
send(sock , payload, payload_size, 0);
sprintf(payload, "%i%i%03d", mode, val, atoi(argv[element+1]));
send(sock , payload, 6, 0);

usleep(5);

close(sock);
free(payload);
return 0;
}
33 changes: 26 additions & 7 deletions clients/Python/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,40 @@

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
time.sleep(0.2)

sendVar = ''
payload = ''
mode = 0
val = 0
command_index = 0

for index, arg in enumerate(sys.argv):
if arg in ['--ipaddress', '-ip']:
HOST = sys.argv[index+1]
if arg in ['--keyboard', '-k']:
sendVar = sys.argv[index+1] + 'k'
mode = 3
command_index = index
if arg in ['--pointerX', '-pX']:
mode = 2
val = 0
command_index = index
if arg in ['--pointerY', '-pY']:
mode = 2
val = 1
command_index = index
if arg in ['--help', '-h']:
print("Virtual HID Socket Python Client")
print(" Usage: client -k 115 ")
print(" Usage: client -k 115 ")
print("Available Commands: ")
print(" -h / --help : Show help")
print(" -k / --keyboard [code]: Sends keyboard event over socket")
print(" -ip / --ipaddress : Server ip address(Default: 127.0.0.1)")
print(" -h / --help : Show help")
print(" -k / --keyboard [value]: Sends keypress event over socket")
print(" -pX / --pointerX: Sends X axis coordinates over socket")
print(" -pY / --pointerY [value]: Sends Y axis coordinates over socket")


payload = str(mode) + str(val) + sys.argv[command_index+1]

s.send(sendVar.encode())
s.send(payload.encode())

time.sleep(0.1)
s.close()
106 changes: 67 additions & 39 deletions server/src/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <stdlib.h> //exit
#include <sys/socket.h>
#include <linux/uinput.h>
#include <netinet/tcp.h>

#define PORT 8080 //Socket port

Expand All @@ -30,13 +31,25 @@ struct uinput_setup usetup;
//Key events must be defined in keys[] before using
int keys[] = {BTN_LEFT, BTN_RIGHT, KEY_VOLUMEUP, KEY_VOLUMEDOWN};

//Socket
int server_fd;
int new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[10];


short mode;
short ev_val;
short neg;
int incoming_code;

void error_handle(char* msg){
perror(msg);
exit(EXIT_FAILURE);
}

/*
* Sends input events
*/
Expand All @@ -53,6 +66,14 @@ void emit(int fd, int type, int code, int val){
write(fd, &ie, sizeof(ie));
}

int socket_accept(){
if((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen))<0){
error_handle("accept");
return 0;
}
return 1;
}

int main(){
int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);

Expand All @@ -77,15 +98,13 @@ int main(){
ioctl(fd, UI_DEV_CREATE);

//Create socket file descriptor
if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("socket failed");
exit(EXIT_FAILURE);
if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
error_handle("socket failed");
}

//Attach socket to the port 8080
if(setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))){
perror("setsockopt");
exit(EXIT_FAILURE);
if(setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT | TCP_NODELAY | IPPROTO_TCP, &opt, sizeof(opt))){
error_handle("setsockopt");
}

address.sin_family = AF_INET;
Expand All @@ -94,65 +113,74 @@ int main(){

//Bind
if(bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0){
perror("bind failed");
exit(EXIT_FAILURE);
error_handle("bind");
}

if(listen(server_fd, 3)<0){
perror("listen");
exit(EXIT_FAILURE);
error_handle("listen");
}

if((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen))<0){
perror("accept");
exit(EXIT_FAILURE);
}
socket_accept();

while(1){
char buffer[1024] = {0};
valread = recv(new_socket, buffer, 1024, 0);

valread = recv(new_socket, buffer, 10, 0);

if(valread>0){
int buffer_len = strlen(buffer);

printf("Received: %s Size: %i\n", buffer, buffer_len); //For debugging
printf("Received: %s Size: %i\n", buffer, 0); //For debugging

short mode = buffer[0]-'0'; //char to int
mode = buffer[0]-'0'; //char to int

buffer[0] = '0'; //Making buffer '0' because atoi giving wrong value
int incoming_code = atoi(buffer); // char* to int for mode 1
ev_val = buffer[1]-'0';
buffer[1] = '0';
neg = 0;
if(buffer[2] == '-'){
neg = 1;
buffer[2] = '0';
}

incoming_code = atoi(buffer); // char* to int for mode 1

/*
* 1 - Keyboard
* 0 - Key Report
* 1 - Key Press - Any device
* 2 - Mouse Pointer
* 3 - Mouse Buttons
*
* Ex:
* Left Click Event -> 11272 -> 1:key press, 1: press val, 272: keycode
* X Axis -> 20010 -> 2: pointer, 0: x axis, 010: +10
* Y Axis -> 21-10 -> 2: pointer, 1: y axis, -10: -10
*/
switch (mode){
case 0:
emit(fd, EV_SYN, SYN_REPORT, 0);
usleep(5);
break;
case 1:
emit(fd, EV_KEY, incoming_code, 1);
emit(fd, EV_SYN, SYN_REPORT, 0);
emit(fd, EV_KEY, incoming_code, 0);
emit(fd, EV_SYN, SYN_REPORT, 0);
usleep(5);
case 1:
emit(fd, EV_KEY, incoming_code, ev_val);
break;
case 2:
if(incoming_code == 0){
emit(fd, EV_REL, REL_X, 1);
}else if(incoming_code == 1){
emit(fd, EV_REL, REL_Y, 1);
case 2:
if(neg){
incoming_code = -incoming_code;
}
if(ev_val == 0){
emit(fd, EV_REL, REL_X, incoming_code);
}else if(ev_val == 1){
emit(fd, EV_REL, REL_Y, incoming_code);
}
break;
case 3:
emit(fd, EV_KEY, incoming_code, 1);
emit(fd, EV_SYN, SYN_REPORT, 0);
usleep(5);
emit(fd, EV_KEY, incoming_code, 0);
break;
}
usleep(2);
emit(fd, EV_SYN, SYN_REPORT, 0);
usleep(5);
}else{
new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen);
}
socket_accept();
}
usleep(10);
}

sleep(1);
Expand Down
Loading

0 comments on commit 6afd4c5

Please sign in to comment.