主题 : 补充arm板间网络的文件传输问题 复制链接 | 浏览器收藏 | 打印
是非审之于心 毁誉听之于人 得失安之于数
级别: 新手上路
UID: 56211
精华: 0
发帖: 24
金钱: 120 两
威望: 24 点
综合积分: 48 分
注册时间: 2011-10-01
最后登录: 2013-04-20
楼主  发表于: 2012-12-06 21:06

 补充arm板间网络的文件传输问题

[ 第一个arm板到第二个arm板传输有问题很卡,arm板是Linux系统,tinny6410的板子。程序如下:服务器端(arm1)
复制代码
  1. #include <stdio.h>//server program
  2. #include <stdlib.h>//第一个arm板服务器端代码
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netdb.h>
  7. #include <stddef.h>
  8. #include <unistd.h>
  9. #include <pthread.h>
  10. #include <fcntl.h>
  11. #include <io.h>
  12. #include <sys/stat.h>
  13. #include <unistd.h>
  14. #include <linux/tcp.h>
  15. #define SERVER_PORT 7777
  16. #define LISTEN_QUEUE_LENGTH 20
  17. #define BUFFER_SIZE 1024
  18. #define MAX_THREAD_NUM 100
  19. #define HOST_ADDR "202.207.25.53"
  20. int thread_count = 0;
  21. pthread_t threads[MAX_THREAD_NUM];
  22. int static cout=1;
  23. int client_conn;
  24. int flag=0,tmp_sock;
  25. int pthread_err;
  26. fd_set rfd_set,wfd_set;
  27. struct timeval timeout={2,0};
  28. pthread_attr_t attr,attr1;  
  29.    struct sched_param param,param1;  
  30.   // long newprio_send=108400000,newprio_net=1083;
  31. /**
  32. * 艙脫脢脮脢媒鸥脻碌脛脰沤脨脨潞炉脢媒
  33. * @param conn_socket
  34. */
  35. void recv_data(int conn_socket);
  36. /*
  37. * 脰梅路艙路拧
  38. */
  39. int main(int argc, char** argv)
  40. {
  41.     // 艙拧脕垄Socket
  42. int ret;
  43.     int server_socket = socket(PF_INET, SOCK_STREAM, 0);
  44.     if (server_socket < 0) {
  45.         printf("Socket create failed.\n");
  46.         return EXIT_FAILURE;
  47.     }
  48.     {
  49.         int opt = 1;
  50.         setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt));
  51.     }
  52.     // 脡猫脰脙路镁脦帽脝梅露脣艗脿脤媒脤脳艙脫脳脰虏脦脢媒
  53.     struct sockaddr_in server_addr;
  54.     bzero(&server_addr, sizeof (server_addr));
  55.     server_addr.sin_family = AF_INET;
  56.     server_addr.sin_addr.s_addr = inet_addr(HOST_ADDR);
  57.     server_addr.sin_port = htons(SERVER_PORT);
  58.     // 掳贸露拧露脣驴脷
  59.     if (bind(server_socket, (struct sockaddr*) &server_addr, sizeof (server_addr)))
  60.     {
  61.         printf("Bind port %d failed.\n", SERVER_PORT);
  62.         return EXIT_FAILURE;
  63.     }
  64.     
  65.     // 驴陋脢艗艗脿脤媒
  66.     if (listen(server_socket, LISTEN_QUEUE_LENGTH))
  67.     {
  68.          printf("Server Listen Failed!");
  69.          return EXIT_FAILURE;
  70.     }
  71. fcntl(server_socket,F_SETFD,O_NONBLOCK);
  72.     
  73.     // 驴陋脢艗沤艩脌铆驴脥禄搂露脣脕卢艙脫
  74.     bzero(&threads, sizeof(pthread_t) * MAX_THREAD_NUM);
  75.     int opt = 1,sok;
  76.   setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt));
  77. sok=setsockopt(server_socket, IPPROTO_TCP,TCP_NODELAY,(char*)&opt, sizeof (opt));
  78. if(sok==-1){printf("Can't seting!");}
  79. while (1)
  80.     {
  81.         struct sockaddr_in client_addr;
  82.         socklen_t length = sizeof(client_addr);
  83.         FD_ZERO(&rfd_set);
  84.         FD_SET(server_socket,&rfd_set);        
  85.         // 艙拧脕垄驴脥禄搂露脣脕卢艙脫
  86.     ret=select(server_socket+1,&rfd_set,NULL,NULL,&timeout);
  87.        if(ret==0){continue;}
  88.        if(FD_ISSET(server_socket,&rfd_set))    
  89. {
  90. int client_conn = accept(server_socket, (struct sockaddr*) &client_addr, &length);
  91.         if (client_conn < 0)
  92.         {
  93.             printf("Server Accept Failed!\n");
  94.             return EXIT_FAILURE;
  95.         }
  96.         
  97.         // 脨脗艙拧脧脽鲁脤, 脢鹿脫脙脨脗脧脽鲁脤脫毛驴脥禄搂露脣艙禄禄楼
  98. pthread_attr_init(&attr);  
  99. pthread_attr_setschedpolicy(&attr,SCHED_RR);
  100. if(flag==0){tmp_sock=client_conn;flag=1;}
  101. else{
  102. //param.sched_priority=newprio_net;
  103. //pthread_attr_setschedparam(&attr, &param);
  104.       pthread_create(threads + (thread_count++), NULL, (void *)recv_data, (void *)client_conn);}
  105.         if (pthread_err != 0)
  106.         {
  107.             printf("Create thread Failed!\n");
  108.             return EXIT_FAILURE;
  109.         }
  110.         
  111.     }
  112. }
  113.     close(server_socket);
  114.     return (EXIT_SUCCESS);
  115. }
  116. void recv_data(int conn_socket)
  117. {      
  118.     char buffer[BUFFER_SIZE];
  119.     bzero(buffer, BUFFER_SIZE);
  120.     int  length = 0,tmp=0;
  121.     while (length = recv(conn_socket, buffer, BUFFER_SIZE, 0))
  122.     {
  123.         if (length < 0)
  124.         {
  125.             printf("Server Recieve Data Failed! code %d\n", length);
  126.         }tmp+=length;
  127.          write(tmp_sock,buffer,length);        
  128.          printf("time=%d\t length=%d\t the buffer is: %s\n ", cout,tmp,buffer);
  129.          cout++;
  130.         bzero(buffer, BUFFER_SIZE);
  131.     }
  132.     close(conn_socket);
  133. }
[code][
#include <stdio.h>、、第二个ARM板的客户端程序
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <io.h>
#include <sys/stat.h>
#include <unistd.h>
#define    MAXBUFFSIZE    1024
#define    PORT 7777

#define HOST_ADDR "202.207.25.53"


int fd_net_syn;
int main(int argc, char *argv[])
{
    int tmp_socket;
if((fd_net_syn=open("send_synew",O_CREAT|O_TRUNC|O_RDWR))==-1)

{
        printf("Can't open the file:send.txt\n");
    }        


        int sockfd,n;
    char recvbuff[MAXBUFFSIZE];
    struct sockaddr_in    servaddr;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0)
    {
        printf("Socket created failed.\n");
        return -1;
    }    
    
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(PORT);
    servaddr.sin_addr.s_addr=inet_addr(HOST_ADDR);
    printf(" connecting...\n");
    if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
    {
        printf("Connect server failed.\n");
        return -1;
    }
else     {printf(" Connect server success.\n");}
    


while(1)
    {
           n=read(sockfd,recvbuff,MAXBUFFSIZE);
            if(n>0)
        {
write(fd_net_syn,recvbuff,n);
printf("the receive data is:%s\nthe byte=%d\n",recvbuff,n);}
    }
  
    return 0;
}


code]这样传输后,第一个arm板到第二个arm板传输文件就非常的慢,不知道为什么?
级别: 新手上路
UID: 66469
精华: 0
发帖: 33
金钱: 165 两
威望: 33 点
综合积分: 66 分
注册时间: 2012-03-30
最后登录: 2019-08-30
1楼  发表于: 2012-12-10 17:14
是有点卡,还好,我遇到的问题是,两块arm通过路由器相连,arm之间只能一端向另一端通信,反过来就会很慢,如果发送了东西然后再发送又变得很快了。单方向传输还是没多少问题。但是两块arm板直接用网线连接又很快,pc和arm通过路由又很快。所以,你这个问题估计不是程序的问题。
是非审之于心 毁誉听之于人 得失安之于数
级别: 新手上路
UID: 56211
精华: 0
发帖: 24
金钱: 120 两
威望: 24 点
综合积分: 48 分
注册时间: 2011-10-01
最后登录: 2013-04-20
2楼  发表于: 2012-12-14 17:01

 回 1楼(nankon) 的帖子

谢谢nankon的回复,确实如你所说,pc传ARM板很快,ARM传ARM很慢。我一直在寻求一种方案可以解决这个问题,现在初步发现ARM板开一个TCP连接传输就会很快,必须彻底关掉PC传输ARM的TCP端口(用shutdown()函数),再建立ARM板间的TCP这样的传输才稍快一些。但是效果还是不理想,希望能够做成pc接ARM接pc那样的传输速度!