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