协议转换--Linux多路网络数据转多串口输出程序实现(demo)
程序实现功能:客户端基于tcp协议通过多路端口向服务端发送数据,服务端异步接收客户端各端口数据,并将从不同端口接收的数据分流输出到指定串口。
简单来说:它只是简单地实现将接收的网络从指定串口输出,接收的串口数据从网口输出。目的只在于测试开发板网口与多串口数据转发时的传输稳定性,于实际应用意义不大:)
tcp_client.c :
客户端创建多个线程向服务端发起tcp连接,循环向服务端发送数据。
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <pthread.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define DEBUG 1
#define PORT_NUMBER 3333
#define SEND_MSG_LEN 1024
#define RECV_MSG_LEN 1024
#define SOCKET_NUM 11
struct FD_HOST{
int fd;
struct hostent *host;
char data[SEND_MSG_LEN];
};
struct FD_HOST pthread_struct[SOCKET_NUM];
int connect_stat = 0;
int Bind_local_port(int fd, unsigned short port_num)
{
int opt = 1;
struct sockaddr_in local_addr;
/*Initialize local_addr structural*/
bzero(&local_addr,sizeof(local_addr)); //set 0
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(port_num);
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
/*bind sockfd_client*/
if(bind(fd, (struct sockaddr *)(&local_addr), sizeof(struct sockaddr)) == -1)
{
fprintf(stderr, "Bind error:%s\n\a", strerror(errno));
return -1;
}
return 0;
}
int Connect_server(int fd, struct hostent *host)
{
struct sockaddr_in server_addr;
/*Initialize server_addr structural*/
bzero(&server_addr,sizeof(server_addr)); //set 0
server_addr.sin_family = AF_INET; // IPV4
server_addr.sin_port = htons(PORT_NUMBER); //set server port_number
server_addr.sin_addr = *((struct in_addr *)host->h_addr); //set server ip
/*client start to connect to server*/
if(connect(fd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)) == -1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
printf("Please check the line connected to server\n");
connect_stat = 0;
return -1;
}
connect_stat = 1;
#if DEBUG
/*connected success*/
printf("Connected success!\n");
#endif
return 1;
}
void Send_msg(struct hostent *host, int fd, unsigned char message[SEND_MSG_LEN])
{
int read_bytes,send_bytes;
/*send data to server*/
#if DEBUG
printf("Send message to server..\n");
#endif
if(connect_stat == 1)
{
if((send_bytes = write(fd, message, SEND_MSG_LEN)) == -1 )
{
fprintf(stderr,"Write Error:%s\a\n",strerror(errno));
if(connect_stat == 1)
{
close(fd);
connect_stat = 0;
}
Connect_server(fd, host);
return ;
}
printf("Send Success %d bytes!\n",send_bytes);
}
else
{
printf("connect_stat==0,it dosen't connect to server\n");
}
}
void Send_msg_always(struct FD_HOST *fd_host)
{
while(1)
{
Send_msg(fd_host->host, fd_host->fd, fd_host->data);
sleep(1);
}
}
int main(void)
{
int ret, i;
char c = 'a';
char *host_name = "192.168.20.103";
char message[SEND_MSG_LEN];
/*port number array*/
unsigned short port_num[SOCKET_NUM] = {1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011};
int sockfd_client[SOCKET_NUM];
struct hostent *host