【苏嵌实训-嵌入式 linux C 第 9天】

项目名称【苏嵌实训-嵌入式 linux C 第 9天】
今日进度以及任务嵌入式Linux C网络编程加线程
本日任务完成情况笔记见表格下方。
本日开发中出现的问题汇总
本日未解决问题
本日开发收获学习了网络编程加线程的代码实现
其他

TCP的服务端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>

//ctrl C 退出

#define PORT 33333

void * recv_message(void *arg)
{
	int ret;
	int cfd = *((int *)arg);

	char buffer[1024];

	while(1)
	{
		memset(buffer,0,sizeof(buffer));
		if((ret = recv(cfd,buffer,sizeof(buffer),0)) < 0)
		{
			perror("recv error!");
			exit(1);
		}

		if(ret == 0)
		{
			printf("%d is close!\n",cfd);
			pthread_exit(NULL);
		}

		printf("recv = %s\n",buffer);
		usleep(3);
	}

	pthread_exit(NULL);
}




void * send_message(void *arg)
{
	int ret;
	int cfd = *((int *)arg);

	while(1)
	{
		if((ret = send(cfd,"hello  world",12,0)) < 0)
		{
			perror("send error!");
			exit(1);
		}

		if(ret == 0)
		{
			printf("%d is close!\n",cfd);
			pthread_exit(NULL);
		}

		sleep(5);
	}

	pthread_exit(NULL);
}

int main()
{
	int sockfd;
	int cfd;
	int c_len;

	char buffer[1024];

	pthread_t id;

	struct sockaddr_in addr;
	struct sockaddr_in c_addr;


	//创建套接字:socket函数
	sockfd = socket(AF_INET,SOCK_STREAM,0);//IPV4,TCP
	if(sockfd == -1)
	{
		perror("socket create error!");
		exit(1);
	}
	printf("socket success!\n");

	//先关客户端,再关服务器,否则会出现无法绑定的问题
	int opt = 1;
	setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
	//以上为无法绑定解决


	//给套接字绑定IP地址和端口号:bind函数
	bzero(&addr,sizeof(struct sockaddr_in));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);//字节序转化//转成本地的
	addr.sin_addr.s_addr = inet_addr("192.168.137.129");//将网络地址转化为二进制数

	if(bind(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr_in)) < 0)
	{
		perror("bind error!");
		exit(1);
	}
	printf("bind success!\n");

	//将套接字文件描述符,从主动变为被动文件描述符(做监听准备):listen函数
	if(listen(sockfd,3) < 0)
	{
		perror("listen error!");
		exit(1);
	}
	printf("listen success!\n");

	//被动监听客户的连接并响应:accept函数
	while(1)
	{
		memset(buffer,0,sizeof(buffer));

		bzero(&c_addr,sizeof(struct sockaddr_in));
		c_len = sizeof(struct sockaddr_in);

		cfd = accept(sockfd,(struct sockaddr *)(&c_addr),&c_len);

		printf("accept............!\n");

		if(cfd == -1)
		{
			perror("accept error!");
			exit(1);
		}
		printf("accept success!\n");

		printf("port = %d,ip = %s\n",ntohs(c_addr.sin_port),inet_ntoa(c_addr.sin_addr));

		if(pthread_create(&id,NULL,recv_message,(void *)(&cfd)) != 0)
		{
			perror("pthread create error!");
			exit(1);
		}

		if(pthread_create(&id,NULL,send_message,(void *)(&cfd)) != 0)
		{
			perror("pthread create error!");
			exit(1);
		}

		usleep(3);//毫秒级休眠
	}
	return 0;
}

 
 
TCP的客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>

#define PORT 33333

void * recv_message(void *arg)
{
	int ret;
	int sockfd = *((int *)arg);

	char buffer[1024];

	while(1)
	{
		memset(buffer,0,sizeof(buffer));
		if((ret = recv(sockfd,buffer,sizeof(buffer),0)) < 0)
		{
			perror("recv error!");
			exit(1);
		}

		if(ret == 0)
		{
			printf("%d is close!\n",sockfd);
			pthread_exit(NULL);
		}

		printf("recv server = %s\n",buffer);
		usleep(3);
	}

	pthread_exit(NULL);
}

int main()
{
	int sockfd;

	char buffer[1024];

	struct sockaddr_in s_addr;

	pthread_t id;

	//创建套接字
	sockfd = socket(AF_INET,SOCK_STREAM,0);//IPV4,TCP
	if(sockfd == -1)
	{
		perror("socket create error!");
		exit(1);
	}
	printf("socket success!\n");

	//连接
	bzero(&s_addr,sizeof(struct sockaddr_in));
	s_addr.sin_family = AF_INET;
	s_addr.sin_port = htons(PORT);
	s_addr.sin_addr.s_addr = inet_addr("192.168.137.129");

	if(connect(sockfd,(struct sockaddr *)(&s_addr),sizeof(struct sockaddr_in)) < 0)
	{
		perror("connect error!");
		exit(1);
	}
	printf("connect success!\n");

	if(pthread_create(&id,NULL,recv_message,(void *)(&sockfd)) != 0)
	{
		perror("pthread create error");
		exit(1);
	}

	while(1)
	{
		memset(buffer,0,sizeof(buffer));
		printf("Please input send message:\n");
		scanf("%s",buffer);

		write(sockfd,buffer,12);

		usleep(3);

	}

	shutdown(sockfd,SHUT_RDWR);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值