当前位置: 首页 > article >正文

网络编程多线程服务器应用

1、多进程多线程并发服务器实现一遍提交

服务器部分代码:

/多线程并发服务器
#include<myhead.h>
#define IP "192.168.60.88"
#define PORT 1028
#define BACKLOG 28
typedef struct 
{
	struct sockaddr_in client;
	int newfd;
}Link;
void *fun(void *sss)
{
	int newfd=((Link *)sss)->newfd;
	struct sockaddr_in client=((Link *)sss)->client;
	printf("%s发来信息\n",inet_ntoa(client.sin_addr));
	char buff[1024];
	while(1)
	{
		int len=recv(newfd,buff,sizeof(buff),0);
		if(len==0)
		{
			printf("客户端退出\n");
			break;
		}
		printf("收到消息:%s\n",buff);
		strcat(buff,"2000");
		send(newfd,buff,sizeof(buff),0);
	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//创建套接字
	int oldfd= socket(AF_INET,SOCK_STREAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//绑定
	struct sockaddr_in server={
	.sin_family=AF_INET,
	.sin_port=htons(PORT),
	.sin_addr.s_addr=inet_addr(IP),
	};
	if(bind(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
	{
		perror("bind");
		return -1;
	}
	//监听
	if(listen(oldfd,BACKLOG)==-1)
	{
		perror("listen");
		return -1;
	}
	struct sockaddr_in client;
	socklen_t client_len=sizeof(client);
	while(1)
	{
		int newfd=accept(oldfd,(struct sockaddr *)&client,&client_len);
		Link jy;
		jy.newfd=newfd;
		jy.client=client;

		pthread_t tid;
		tid=pthread_create(&tid,NULL,fun,&jy);
		if(tid==-1)
		{
			perror("pthread_create");
			return -1;
		}
		pthread_detach(tid);
	}
	return 0;
}

客户端部分:

#include <myhead.h>
#define IP "192.168.60.88"
#define PORT 1028
int main(int argc, const char *argv[])
{
	//1、创建套接字
	int oldfd = socket(AF_INET,SOCK_STREAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2、连接服务器
	struct sockaddr_in server = {
	.sin_family = AF_INET,
	.sin_port = htons(PORT),
	.sin_addr.s_addr = inet_addr(IP),
	};
	if(connect(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
	{
		perror("connect");
		return -1;
	}
	//3、数据收发
	char buff[1024];
	while(1)
	{
		fgets(buff,sizeof(buff),stdin);//键盘输入字符串
		buff[strlen(buff)-1] = '\0';

		send(oldfd,buff,sizeof(buff),0);
		int len = recv(oldfd,buff,sizeof(buff),0);
		if(len==0)
		{
			printf("服务器意外退出\n");
			break;
		}
		printf("接收服务器消息:%s\n",buff);
	}
	close(oldfd);
	return 0;
}

代码演示:

2、将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。

发送端部分:

#include<myhead.h> 
#define IP "192.168.61.255"
#define PORT 1028
int main(int argc, const char *argv[])
{
	//1、创建UDP的套接字
	int oldfd=socket(AF_INET,SOCK_DGRAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2、设置套接字允许广播
	int n=1;
	if(setsockopt(oldfd,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n))==-1)
	{
		perror("setsockopt");
		return -1;
	}
	printf("允许广播设置成功\n");
	//3、绑定
	struct sockaddr_in send={
	.sin_family=AF_INET,
	.sin_port=htons(PORT),
	.sin_addr.s_addr=inet_addr(IP),
	};
	/*
	if(bind(oldfd,(struct sockaddr *)&send,sizeof(send))==-1)
	{
		perror("bind");
		return -1;
	}
	printf("绑定成功\n");
	*/
	char buff[1024];
	while(1)//信息发送
	{
		bzero(buff,sizeof(buff));
		fgets(buff,sizeof(buff),stdin);//手动输入
		buff[strlen(buff)-1]='\0';
		sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&send,sizeof(send));
		printf("发送成功\n");
	}
	close(oldfd);
	return 0;
}

接收段部分:

//广播接收端
#include<myhead.h> 
#define IP "192.168.61.255"
#define PORT 1028
int main(int argc, const char *argv[])
{
	//1、创建套接字
	int oldfd=socket(AF_INET,SOCK_DGRAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2、填充结构体
	struct sockaddr_in recv={
	.sin_family=AF_INET,
	.sin_port=htons(PORT),
	.sin_addr.s_addr=inet_addr(IP),
	};
	//3、绑定
	if(bind(oldfd,(struct sockaddr *)&recv,sizeof(recv))==-1)
	{
		perror("bind");
		return -1;
	}
	printf("绑定成功\n");
	struct sockaddr_in cy;
	socklen_t cy_len =sizeof(cy);
	char buff[1024];
	 while(1)
	 {
		recvfrom(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&cy,&cy_len);

		printf("接收到了%s信息:%s\n",inet_ntoa(cy.sin_addr),buff);
		strcat(buff,"^_^");
		sendto(oldfd,buff ,sizeof(buff),0,(struct sockaddr *)&recv,sizeof(recv));
		printf("转发成功\n");

	 }
	 close(oldfd);//关闭描述符
	return 0;
}

代码演示:


http://www.kler.cn/a/403923.html

相关文章:

  • 7天掌握SQL - 第一天:数据库基础与SQL入门
  • Swift从0开始学习 对象和类 day3
  • 测试工程师如何在面试中脱颖而出
  • 大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志
  • C++和js对比
  • Linux运维篇-iscsi存储搭建
  • RNN数学公式推导
  • 单例模式与QT中的C++实现
  • Layui Table 行号
  • uniapp将图片url转换成base64支持app和h5
  • Django项目 | 实现用户注册和登录时的手机号验证
  • OBOO鸥柏28.6寸液晶广告屏:创新技术引领智能显示新时代
  • Fibonacci数列(斐波那契数列或兔子数列)
  • 算法设计与分析-上机实验10
  • 鸿蒙网络编程系列50-仓颉版TCP回声服务器示例
  • unity li2cpp逆向原理是什么?
  • 多路归并+set去重
  • C++详细笔记(六)string库
  • PHP实现双向队列
  • C++结构型设计模式之适配器模式概述
  • HTML和CSS 表单、表格练习
  • es写入磁盘的过程以及相关优化
  • 极简AI工具箱网站开源啦!
  • vue3+elementui-plus el-dialog全局配置点击空白处不关闭弹窗
  • iOS屏幕共享技术实践
  • 【K8S问题系列 | 16】如何有效地监控资源使用情况并设置告警?