网络编程 day 5

这篇具有很好参考价值的文章主要介绍了网络编程 day 5。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、根据select TCP服务器流程图编写服务器

#include <myhead.h>

#define ERR_MSG(msg)  do{\
    fprintf(stderr, "__%d__:", __LINE__); \
    perror(msg);\
}while(0)

#define PORT 8888               //端口号,范围1024~49151
#define IP  "192.168.114.72"   //本机IP,ifconfig


int main(int argc, const char *argv[])
{
    //创建流式套接字 socket
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    printf("socket create success sfd=%d\n", sfd);

    //允许端口快速的被复用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口快速的被复用成功\n");


    //填充地址信息结构体给bind函数绑定,
    //真实的地址信息结构体根据地址族指定 AF_INET:man 7 ip
    struct sockaddr_in sin;
    sin.sin_family      = AF_INET;      //必须填AF_INET;
    sin.sin_port        = htons(PORT);  //端口号的网络字节序
    sin.sin_addr.s_addr = inet_addr(IP);//本机IP


    //绑定服务器的地址信息---> 必须绑定 bind
    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("bind success\n");


    //将套接字设置为被动监听状态 listen
    if(listen(sfd, 128) < 0)
    {
        ERR_MSG("listen");
        return -1;
    }
    printf("listen success\n");

	//创建一个读集合
	fd_set readfds,tempfds;

	//清空集合
	FD_ZERO(&readfds);

	//将需要监测的文件描述符添加到集合中
	FD_SET(0,&readfds);
	FD_SET(sfd,&readfds);

	int maxfd = sfd;    //存储最大的文件描述符

	int s_res = -1;
	ssize_t res = -1;
    char buf[128] = "";
	int newfd = -1;
	struct sockaddr_in cin;           //存储客户端的地址信息
	socklen_t addrlen = sizeof(cin);  //真实的地址信息结构体的大小

	while(1)
    {
       tempfds = readfds;
	   //执行IO多路复用函数
	   s_res = select(maxfd+1,&tempfds,NULL,NULL,NULL);

		//进行判断
		if(s_res < 0)
        {
            ERR_MSG("select");
            return -1;
        }
        else if(0 == s_res)
        {
            printf("time out\n");
			break;
		}

		printf("_%d_\n",__LINE__);



		//能运行到当前位置,则代表select函数解除阻塞
		//此时集合中会只剩下产生事件的文件描述符
		//0号准备就绪,则集中会只剩下0号
		//sfd准备就绪,则集合中会只剩下sfd
		//0和sfd均准备就绪,则集中会剩下0和sfd;
		//只需要判断集合中剩下哪个文件描述符,走对应处理函数即可
		

		if(FD_ISSET(0,&tempfds))
		{
			printf("触发键盘输入事件\n");
			bzero(buf,sizeof(buf));
			fgets(buf,sizeof(buf),stdin);
			buf[strlen(buf)-1] = 0;

			printf(":%s\n",buf);

		}
			//判断sfd是否在文件集合中
		if(FD_ISSET(sfd,&tempfds))
		{
			printf("触发客户端连接事件\n");
			newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
			if(newfd < 0)
			{
				ERR_MSG("newfd");
				return -1;
			}
			printf("[%s:%d]客户端连接成功 newfd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
			
			FD_SET(newfd,&readfds);    //将newfd添加到集合中

			maxfd = maxfd>newfd ? maxfd:newfd; //更新maxfd
		}

	//除了0和sfd事件外,其余均为newfd对应的客户端交互事件
	//通过循环i,遍历所有newfd是否在tempfds中。
	

	for(int i=4; i<=maxfd; i++)
	{
		if(FD_ISSET(i,&tempfds))
		{
			printf("触发客户端交互事件\n");
			bzero(buf,sizeof(buf));
			//接收
			res = recv(i,buf,sizeof(buf),0);
			if(res < 0)
			{
				ERR_MSG("recv");
				return -1;

			}
			else if(0 == res)
			{
				printf("[%s;%d]客户端下线 newfd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),i);
				//关闭文件描述符
				close(i);
				//将文件描述符从集合中剔除
				FD_CLR(i,&readfds);
				continue;
			}

			printf("[%s:%d]newfd=%d ; %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),i,buf);

			//发送
			strcat(buf,"*_*");
			if(send(i,buf,sizeof(buf),0) <0 )
			{
				ERR_MSG("send");
				return -1;
			}
			printf("send success\n");
			}
		}
	}
	//关闭文件名描述符
	if(close(sfd) < 0)
	{
		ERR_MSG("close");
		return -1;
	}

	return 0;
}


2、思维导图

网络编程 day 5,网络,php,开发语言,数据挖掘文章来源地址https://www.toymoban.com/news/detail-694347.html

到了这里,关于网络编程 day 5的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络编程Day6

    网络聊天室 服务器 客户端

    2024年01月22日
    浏览(39)
  • day17-网络编程(上)

    你必须了解的网络相关设备和基础概念。 假设 alex 上了一个野鸡大学买了一台电脑,电脑里存了1部小电影,整宿整宿的在宿舍反复的看。 alex 如何想要和室友 于超 进行收发数据,可以通过一根网线来进行连接,并进行数据的传输。 1.1.1 交换机 其他2位室友如何也想和他们的

    2024年04月22日
    浏览(41)
  • 网络编程day1

    2024年02月01日
    浏览(49)
  • 网络编程day2

    TCP的基本通信 服务器端 客户端 实现机械臂控制

    2024年01月18日
    浏览(60)
  • 网络编程-day3

       UDP服务器: UDP客户端:       

    2024年02月12日
    浏览(43)
  • 网络编程day5

    思维导图 多路复用 selsect ser cli poll ser cli

    2024年01月22日
    浏览(40)
  • day18-网络编程(下)

    OSI的7层模型对于大家来说可能不太好理解,所以我们通过一个案例来讲解: 假设,你在浏览器上输入了一些,内部通过DNS找到对应的IP后,再发送数据时内部会做如下的事: 应用层:规定数据的格式。 表示层:对应用层数据的编码、压缩(解压缩)、分块、加密(解

    2024年04月22日
    浏览(37)
  • 网络编程 day4

    1-广播模型 接收方 发送方 2-组播模型 接收方 发送方 3-多进程并发服务器 4-多线程并发服务器

    2024年02月07日
    浏览(35)
  • 网络编程day6作业

    完成网络聊天室编写 ser cli 思维导图:https://mubu.com/app/edit/home/5fnWgXpb5GT#m

    2024年02月09日
    浏览(37)
  • 23062网络编程day5

    根据select TCP服务器流程图编写服务器 思维导图  

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包