2013-04-21 58 views
0

我通过TCP传输整数我一直在努力使此工作正常工作数天,现在我非常接近。我正在做的是从USB游戏杆获取输入并将Axis的值发送到客户端。我有这样的工作,但我的问题是,它总是停在251处。我的意思是我设置一个变量,每次将Axis的值打印到客户端屏幕上时加1。我玩过MAXRCVLEN,但它仍然停留在251处。任何人都可以看看我的代码,看看我在这里做错了什么吗?通过TCP传输数据始终停止在251传输

这是server.c文件:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 

//joysick libraries 
#include <sys/ioctl.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <linux/joystick.h> 

//Joysick device 
#define JOY_DEV "/dev/input/js0" 

//TCP Port number 
#define PORTNUM 2343 

int main(int argc, char *argv[]) 
{ 

    //TCP connect 
    struct sockaddr_in dest; /* socket info about the machine connecting to us */ 
    struct sockaddr_in serv; /* socket info about our server */ 
    int mysocket;   /* socket used to listen for incoming connections */ 
    socklen_t socksize = sizeof(struct sockaddr_in); 

    memset(&serv, 0, sizeof(serv));   /* zero the struct before filling the fields */ 
    serv.sin_family = AF_INET;    /* set the type of connection to TCP/IP */ 
    serv.sin_addr.s_addr = htonl(INADDR_ANY); /* set our address to any interface */ 
    serv.sin_port = htons(PORTNUM);   /* set the server port number */ 

    mysocket = socket(AF_INET, SOCK_STREAM, 0); 

    /* bind serv information to mysocket */ 
    bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr)); 

    /* start listening, allowing a queue of up to 1 pending connection */ 
    listen(mysocket, 1); 
    int consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize); 

    //TCP variable 
    char msg1[10]; 


    //Joystick variables 
    int xAxis; 
    int yAxis; 
    int xSpeed; 
    int ySpeed; 

    //Joystick initialize 
    int joy_fd, *axis=NULL, num_of_axis=0, num_of_buttons=0, x; 
    char *button=NULL, name_of_joystick[80]; 
    struct js_event js; 

    if((joy_fd = open(JOY_DEV , O_RDONLY)) == -1) 
    { 
     printf("Couldn't open joystick\n"); 
     return -1; 
    } 

    //Get number of axes, buttons and name of joystick. Print results to screen 
    ioctl(joy_fd, JSIOCGAXES, &num_of_axis); 
    ioctl(joy_fd, JSIOCGBUTTONS, &num_of_buttons); 
    ioctl(joy_fd, JSIOCGNAME(80), &name_of_joystick); 

    axis = (int *) calloc(num_of_axis, sizeof(int)); 
    button = (char *) calloc(num_of_buttons, sizeof(char)); 

    printf("Joystick detected: %s\n\t%d axis\n\t%d buttons\n\n" 
      , name_of_joystick 
      , num_of_axis 
      , num_of_buttons); 

    //Use non blocking mode for joystick 
    fcntl(joy_fd, F_SETFL, O_NONBLOCK); /* use non-blocking mode */ 

    //infinite loop for reading joystick 
    while(1) { 

     //loop for tcp connection 
     while(consocket){ 
      /* read the joystick state */ 
      read(joy_fd, &js, sizeof(struct js_event)); 

      /* see what to do with the event */ 
      switch (js.type & ~JS_EVENT_INIT) 
      { 
       case JS_EVENT_AXIS: 
        axis [ js.number ] = js.value; 
        break; 
       case JS_EVENT_BUTTON: 
        button [ js.number ] = js.value; 
        break; 
      } 
      //Give msg1 variable the value of axis[0] 
      sprintf(msg1, "%d", axis[0]); 

      //TCP send 

      char msg[] = "Hello"; 
      printf("Value is: %d\n", axis[0]); 
      //printf("Incoming connection from %s - sending welcome\n", inet_ntoa(dest.sin_addr)); 
      send(consocket, msg1, strlen(msg1), 0); 
      consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize); 
      printf("Value X is: %s\n", msg1); 
      printf(" \r"); 
      fflush(stdout); 
     } 

     close(consocket); 
     close(mysocket); 
     return EXIT_SUCCESS; 

    } 

    //Joystick close 
    close(joy_fd); /* too bad we never get here */ 
    return 0; 
} 

这是client.c文件

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 

#define MAXRCVLEN 10000 
#define PORTNUM 2343 

int main(int argc, char *argv[]) 
{ 
    int i = 0; 
    while(1){ 
     char buffer[MAXRCVLEN + 1]; /* +1 so we can add null terminator */ 
     int len, mysocket; 
     struct sockaddr_in dest; 

     mysocket = socket(AF_INET, SOCK_STREAM, 0); 

     memset(&dest, 0, sizeof(dest));    /* zero the struct */ 
     dest.sin_family = AF_INET; 
     dest.sin_addr.s_addr = inet_addr("192.168.254.16"); /* set destination IP number */ 
     dest.sin_port = htons(PORTNUM);    /* set destination port number */ 

     connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr)); 

     len = recv(mysocket, buffer, MAXRCVLEN, 0); 

     /* We have to null terminate the received data ourselves */ 
     buffer[len] = '\0'; 

     printf("Received %s (%d bytes).\n", buffer, len); 
     printf("Number is: %d", i); 
     i++; 
     //close(mysocket); 
    } 
    return EXIT_SUCCESS; 
} 
+0

是否有理由让您每次都通过循环创建新连接?另外,你没有关闭任何套接字,这可能会导致问题。 – Xymostech 2013-04-21 21:56:48

+0

@Xymostech我在'client.c'中取消了'close(mysocket)'的注释,现在在它停止之前im达到1017。我是使用TCP进行编程的新手,所以我只是把while循环放在顶部。我会在哪里放置它,以便它不会每次都建立新的连接并只接收新的数据? – Yamaha32088 2013-04-21 22:03:11

+1

如果您在服务器的“accept”之前加上“close(consocket)”,会发生什么?你可以不在你的循环里面调用'connect'或'accept'。 – Xymostech 2013-04-21 22:06:35

回答

2

问题是你每次在客户端循环中连接一个TCP套接字。 然后,您在服务器循环中的每个循环中接受新的连接。

256可能与每次不关闭旧的丢弃套接字有关,并且每个进程资源或文件句柄都用完了。

这不是编写客户端/服务器应用程序的正确方法。

你应该做的是在进入循环之前接受一次连接。 然后发送只要需要,但不发送,直到你实际上有一个连接套接字(由接受获得)。

客户端应该在循环之前连接一次,并在连接时它应该在该循环内调用recv。如果有错误,则可以再次调用连接。

关于如何在Beej's guide to Network Programming中使用套接字编写基本客户端/服务器应用程序,这是套接字编程的最佳资源之一,有一些非常好的示例和详细信息。

0

,如果你在你的服务器的accept之前把close(consocket)会发生什么?你可能不会在你的循环中调用connectaccept

This is what I mean关于添加关闭线。这有帮助吗? (这应该是你的服务器代码中的循环)

这些意见通过@Xymostech解决了我的问题!