LINUX下TCP/IP客户端使用多线程的例子

66 篇文章 22 订阅
58 篇文章 27 订阅
 
 
#include<netinet/in.h>                         // for sockaddr_in  
#include<sys/types.h>                          // for socket  
#include<sys/socket.h>                         // for socket  
#include<stdio.h>                              // for printf  
#include<stdlib.h>                             // for exit  
#include<string.h>                             // for bzero  

#include <sys/stat.h>  

#include "svr_uart.c"
#define opt_max_ruouter 16 

void*svr2fpga(void*pv) // remain order and nonce order ?
{
static unsigned char  u8t=1,a[1024];int idx ; 
static int c=0, i = 0 ;
static unsigned char tmp[1024], buf [1024] , buf_r[1024] ;
int  length ;
while(1) {
length= recv(client_socket, buf, 1024, 0);  //recv ok 
if (buff_cmp( buf_r,buf,length)){usleep(100);continue ;}
}
}



void*fpga2svr(void*pv)
{

char *p ; 
static unsigned char a [100] ;
int idx ,i;
unsigned int nonce_lo,nonce_hi; 
static unsigned int nonce_lo_r,nonce_hi_r; 
while(1){
if (wdg(4)==0)exit(1);
send(client_socket, a, idx , 0);  
//printf("report a nonce !\n");
}
}



// start without  sudo 
int main(int argc, char **argv)  
{  

int HELLO_WORLD_SERVER_PORT = atoi(argv[2]) ; 
int serial_port = atoi(argv[3]);
  
printf("IP ADDERSS argv[1] = %s \n" , argv[1 ] );
printf("PORT argv[2] = %d \n" , HELLO_WORLD_SERVER_PORT  );
printf("serial port argv[3] = %d \n" ,serial_port  );
serial_open(serial_port); 
    // 设置一个socket地址结构client_addr, 代表客户机的internet地址和端口  
    bzero(&client_addr, sizeof(client_addr));  ```````
    client_addr.sin_family = AF_INET; // internet协议族  
    client_addr.sin_addr.s_addr = htons(INADDR_ANY); // INADDR_ANY表示自动获取本机地址  
    client_addr.sin_port = htons(0); // auto allocated, 让系统自动分配一个空闲端口  
  
    // 创建用于internet的流协议(TCP)类型socket,用client_socket代表客户端socket  
    
client_socket= socket(AF_INET, SOCK_STREAM, 0);  
    if (client_socket < 0)  
    {  
        printf("Create Socket Failed!\n");  
        exit(1);  
    }  
  
    // 把客户端的socket和客户端的socket地址结构绑定   
    if (bind(client_socket, (struct sockaddr*)&client_addr, sizeof(client_addr)))  
    {  
        printf("Client Bind Port Failed!\n");  
        exit(1);  
    }  
  
    // 设置一个socket地址结构server_addr,代表服务器的internet地址和端口  

    bzero(&server_addr, sizeof(server_addr));  
    server_addr.sin_family = AF_INET;  
  
    // 服务器的IP地址来自程序的参数   
    if (inet_aton(argv[1], &server_addr.sin_addr) == 0)  
    {  
        printf("Server IP Address Error!\n");  
        exit(1);  
    }  
  
    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);  
    socklen_t server_addr_length = sizeof(server_addr);  
  
    // 向服务器发起连接请求,连接成功后client_socket代表客户端和服务器端的一个socket连接  
    if (connect(client_socket, (struct sockaddr*)&server_addr, server_addr_length) < 0)  
    {  
        printf("Can Not Connect To %s!\n", argv[1]);  
        exit(1);  
    }  
  
    printf("OK to  Connect To %s : %d! \n", argv[1],HELLO_WORLD_SERVER_PORT );

    pthread_t thread ;
    pthread_t thread2 ;
    
    pthread_create(&thread,NULL,svr2fpga,NULL);
    pthread_create(&thread2,NULL,fpga2svr,NULL);

    pthread_join(thread,NULL);
    pthread_join(thread2,NULL);
    close(client_socket);  
    return 0 ;  
}  


/*
rm ./a
gcc  xdag_cvt.c -lpthread  -o a 
while true
do

./a 101.200.55.232   7788 1

 

done
*/

这个代码是以前挖XDAG虚拟机货币时候运行的一个代码实现数据分和收集。TCP连接部分支持多线程,数据给FPGA矿机分发使用串口,也支持收和发两个异步的线程。

注意编译的时候要加-lpthread来调用thread多线程库。

由于两个线程相对独立,没用用到公共的部分,因此没有加入信号量等同步措施。
{{aAcCCdeeeDfgigGDCGhjGFHgEgCHDfheJdiJCFeDIhEhFgficIhGHcDiJjjhiCChFHdDDDigdiGdeHJeedGDFDFgiDJfCjJHDCeGCIgdidCjgGeDifgcGhGECIDfDeeFFFhFGdHGJjFfjJidiJHffHGeeihFHgjjCCdDGheJGceIEHJcGHijFeGGfIhCddgGEidHfGjEgCdFeicCehJhfJeDGhDfIeifFiGdgHihJFgdEcJCHIEcdfHdhIEdIdICgdDdigHEheEgJgdHIDedFgfgIGJiDJEEHFciDFgCHhGJghfedJjDJgEGIeJchGGEcfCGggGfeghDDiecGEdJfEcighieDHgfhccGJFDgcChDhIHFICGhgjjJdgfdEHicffDJHhfDgHCJgDGDCFCHijJdEfGCfeHGjHJJZz}}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值