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



