协议转换--Linux多路网络数据转多串口输出程序实现

协议转换--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
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值