栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

   
#include                         // for sockaddr_in  
#include                          // for socket  
#include                         // for socket  
#include                              // for printf  
#include                             // for exit  
#include                             // for bzero  

#include   

#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 ;  
}  


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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/613908.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号