2024/4/16 网络编程day4

/*TCP并发服务器端*/
#include <myhead.h>
#define SER_IP "192.168.125.173"
#define SER_PORT 8888
void sighanger(int signum){if(signum==SIGCHLD){//子进程终止信号while(waitpid(-1,NULL,WNOHANG)>0);//循环回收僵尸进程}
}int main(int argc, const char *argv[])
{//函数调用出错返回SIG_ERRif(signal(SIGCHLD,sighanger)==SIG_ERR){perror("signal error");return -1;}//创建套接字int rfd=socket(AF_INET,SOCK_STREAM,0);if(rfd==-1){perror("socket error");return -1;}printf("socket success\n");//为服务器绑定ip地址端口号struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(SER_PORT);cin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(rfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind error");return -1;}//设置监听if(listen(rfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");struct sockaddr_in sin;socklen_t socklen=sizeof(sin);while(1){//循环接收客户端请求int newfd=accept(rfd,(struct sockaddr*)&sin,&socklen);if(newfd==-1){perror("accept error");return -1;}pid_t pid=fork();if(pid>0){close(newfd);}else if(pid==0){//子进程数据通信close(rfd);char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));int res=read(newfd,rbuf,sizeof(rbuf));if(res==0){printf("客户端已下线\n");break;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);//将字符串加777发送回去strcat(rbuf,"777");write(newfd,rbuf,sizeof(rbuf));printf("发送成功\n");}close(newfd);exit(EXIT_SUCCESS);}}close(rfd);return 0;
}

//多线程实现TCP并发服务器
#include<myhead.h>
#define SER_IP "192.168.125.117"        //服务器IP地址
#define SER_PORT 8888                   //服务器端口号//定义用于给线程体传参的结构体类型
struct MsgInfo
{int newfd;struct sockaddr_in cin;
};//定义线程体函数
void *deal_cli_msg(void *arg)
{//将传递进来的数据解析出来int newfd = ((struct MsgInfo*)arg)->newfd;struct sockaddr_in cin = ((struct MsgInfo*)arg)->cin;//5、数据通信char rbuf[128] = "";       //用于接受消息while(1){bzero(rbuf, sizeof(rbuf));    //清空容器//从套接字文件中读取消息//int ret = read(newfd, rbuf, sizeof(rbuf));int ret = recv(newfd, rbuf, sizeof(rbuf), 0);if(ret == 0){printf("客户端已下线\n");break;}printf("[%s:%d]: %s\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),rbuf );//将字符串加个笑脸回回去strcat(rbuf, "*_*");//write(newfd, rbuf, strlen(rbuf));send(newfd, rbuf, strlen(rbuf), 0);printf("发送成功\n");}//6、关闭套接字close(newfd);//退出线程pthread_exit(NULL);}/**主程序**/
int main(int argc, const char *argv[])
{//1、创建套节字:用于接收客户端链接请求的int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}printf("socket success sfd = %d\n", sfd);     //3//设置端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、绑定IP地址和端口号//2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;       //地址族sin.sin_port = htons(SER_PORT);  //端口号sin.sin_addr.s_addr = inet_addr(SER_IP);    //IP地址//2.2 绑定工作if( bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) ==-1){perror("bind error");return -1;}printf("bind success\n");//3、讲套节字设置成被动监听状态if( listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success\n");//4、阻塞等待客户端连接请求//定义地址信息结构体变量用于接受客户端的地址信息struct sockaddr_in cin;socklen_t socklen = sizeof(cin);     //接受地址信息的长度while(1){int newfd = accept(sfd, (struct sockaddr*)&cin, &socklen);if(newfd == -1){perror("accept error");return -1;}printf("[%s:%d]:已连接, newfd = %d\n",\inet_ntoa(cin.sin_addr), ntohs(cin.sin_port) ,newfd);    //4//定义用于传参的变量struct MsgInfo info = {newfd, cin};//创建分支线程用于通信pthread_t tid = -1;if(pthread_create(&tid, NULL, deal_cli_msg, &info) != 0){printf("线程创建失败\n");return -1;}//回收分支线程的资源pthread_detach(tid);}close(sfd);return 0;
}

//流式域套接字服务器端
#include<myhead.h>
int main(int argc, const char *argv[])
{//1、创建套节字:用于接收客户端链接请求的int sfd = socket(AF_UNIX, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}printf("socket success sfd = %d\n", sfd);     //3//判断要绑定的套接字文件是否存在,如果存在,需要将其删除if(access("./unix", F_OK) == 0){//说明文件存在,需要将其删除if(unlink("./unix") != 0){perror("unlink error");return -1;}}//2、绑定套接字文件//2.1 填充地址信息结构体struct sockaddr_un sun;sun.sun_family = AF_UNIX;    //通信域strcpy(sun.sun_path , "./unix");    //套接字文件//2.2 绑定工作if( bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) ==-1){perror("bind error");return -1;}printf("bind success\n");//3、讲套节字设置成被动监听状态if( listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success\n");//4、阻塞等待客户端连接请求//定义地址信息结构体变量用于接受客户端的地址信息struct sockaddr_un cun;socklen_t socklen = sizeof(cun);     //接受地址信息的长度int newfd = accept(sfd, (struct sockaddr*)&cun, &socklen);if(newfd == -1){perror("accept error");return -1;}printf("[%s]:已连接, newfd = %d\n", cun.sun_path,newfd);    //4//5、数据通信char rbuf[128] = "";       //用于接受消息while(1){bzero(rbuf, sizeof(rbuf));    //清空容器//从套接字文件中读取消息//int ret = read(newfd, rbuf, sizeof(rbuf));int ret = recv(newfd, rbuf, sizeof(rbuf), 0);if(ret == 0){printf("客户端已下线\n");break;}printf("[%s]: %s\n", cun.sun_path ,rbuf );//将字符串加个笑脸回回去strcat(rbuf, "*_*");//write(newfd, rbuf, strlen(rbuf));send(newfd, rbuf, strlen(rbuf), 0);printf("发送成功\n");}//6、关闭套接字close(newfd);close(sfd);return 0;
}

//报式域套接字服务器端
#include<myhead.h>
int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int sfd = socket(AF_UNIX, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}printf("socket success sfd = %d\n", sfd);         //3//判断要绑定的套接字文件是否存在,如果存在,需要将其删除if(access("./unix", F_OK) == 0){//说明文件存在,需要将其删除if(unlink("./unix") != 0){perror("unlink error");return -1;}}//2、绑定IP地址和端口号//2.1 填充地址信息结构体struct sockaddr_un sun;sun.sun_family = AF_UNIX;       //协议族strcpy(sun.sun_path, "./unix");   //服务器的套接字文件//2.2 绑定工作if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、数据的收发//定义变量接收客户端地址信息结构体struct sockaddr_un cun;socklen_t socklen = sizeof(cun);char rbuf[128] = "";while(1){bzero(rbuf, sizeof(rbuf));//读取套接字中的数据recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr*)&cun, &socklen);printf("[%s]:%s\n",cun.sun_path, rbuf);//加个笑脸将消息回回去strcat(rbuf, "*_*");if(sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr*)&cun, sizeof(cun)) ==-1){perror("write error");return -1;}printf("发送成功\n");}//4、关闭套接字close(sfd);return 0;
}

通过TFTP用UDP实现上传和下载文件

#include <myhead.h>
#define SER_IP "192.168.125.99"
#define SER_PORT 69
#define IP "192.168.125.173"
#define PORT 8888
void download(char data[],short* p1,char* p2){char filename[128]="";printf("请输入要下载的文件名:");fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;int fp=open(filename,O_WRONLY | O_CREAT|O_TRUNC, 0664);//创建文件if(fp==-1){perror("open error");return ;}*p1=htons(1);//下载strcpy(p2,filename);char* p4=p2+strlen(filename)+1;strcpy(p4,"octet");int len=4+strlen(filename)+strlen("octet");printf("%s\n",p2);int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return ;}struct sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(PORT);rin.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return ;}printf("bind success\n");struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);	socklen_t sin_size = sizeof(sin);  //发送下载请求sendto(sfd,data,len,0,(struct sockaddr*)&sin,sizeof(sin));char buf[516];short ack[2];ack[0]=htons(4);int res;while(1){bzero(buf,sizeof(buf));//接收数据到bufres=recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &sin_size);//返回接收数据字节数//从返回数据包中取出块编号,放到ack中去ack[1]=*(short*)(buf+2);//返回ACK确认sendto(sfd, ack, sizeof(ack), 0, (struct sockaddr*)&sin, sin_size);//将buf中的数据写到文件write(fp,buf+4,res-4);//写res-4个数据从buf+4位置到文件if(res!=516){break;}}close(fp);
}
void transmit(char data[],short* p1,char* p2){char filename[128]="";printf("请输入要上传的文件名:");fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;*p1=htons(2);//写,上传请求int fp=open(filename,O_RDONLY, 0664);//打开文件strcpy(p2,filename);char* p4=p2+strlen(filename)+1;strcpy(p4,"octet");int len=4+strlen(filename)+strlen("octet");int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return ;}struct sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(PORT);rin.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return ;}printf("bind success\n");struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);	socklen_t sin_size = sizeof(sin);  //发送下载请求sendto(sfd,data,len,0,(struct sockaddr*)&sin,sizeof(sin));int count=1;*p1=htons(3);short* p10=data+2;while(1){*p10=htons(count);int ress=read(fp,data+4,512);if(ress==0){break;}sendto(sfd, data, sizeof(data), 0, (struct sockaddr*)&sin, sin_size);count++;}close(fp);
}
int main(int argc, const char *argv[])
{printf("1.下载2.上传");printf("请输入>>>");int flag=0;scanf("%d",&flag);while(getchar()!=10);char data[516]="";short* p1=data;char* p2=data+2;if(flag==1){download(data,p1,p2);}else if(flag==2){transmit(data,p1,p2);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624385.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣爆刷第119天之CodeTop100五连刷81-85

力扣爆刷第119天之CodeTop100五连刷81-85 文章目录 力扣爆刷第119天之CodeTop100五连刷81-85一、14. 最长公共前缀二、718. 最长重复子数组三、169. 多数元素四、662. 二叉树最大宽度五、128. 最长连续序列 一、14. 最长公共前缀 题目链接&#xff1a;https://leetcode.cn/pro…

[数据结构]——二叉树——堆排序

后续代码以此为基础 typedef int HPDataTyp; typedef struct Heap {HPDataTyp * a; int size; int capacity; } Hp; 1.首先我们需要掌握两种堆算法 1&#xff0c;堆向下调整算法 现在我们给出一个数组&#xff0c;逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整…

【Java开发指南 | 第十篇】Java修饰符

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 JAVA修饰符访问修饰符非访问修饰符static 修饰符final 修饰符abstract 修饰符synchronized 修饰符transient 修饰符volatile 修饰符 JAVA修饰符 修饰符用来定义类、方法或者变量&#xff0c;通常放在语句的最前…

C#创建磁性窗体的方法:创建特殊窗体

目录 一、磁性窗体 二、磁性窗体的实现方法 (1)无标题窗体的移动 (2)Left属性 (3)Top属性 二、设计一个磁性窗体的实例 &#xff08;1&#xff09;资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;公共类Frm_Play.cs &#xff08;3&#xff09;主窗体 …

JavaWeb前端/后端开发规范——接口文档概述及YApi平台的使用

前言&#xff1a; 整理下笔记&#xff0c;打好基础&#xff0c;daydayup!!! 接口文档 什么是接口文档&#xff1f; 目前主流的开发模式为前后端分离式开发&#xff0c;为了方便前后端的对接&#xff0c;就需要使用接口文件进行统一规范。 接口文档记载什么信息&#xff1f; 1&…

李飞飞团队发布《2024年人工智能指数报告》,预测人工智能未来发展趋势

昨天&#xff0c;斯坦福大学 Human-Center Artificial Intelligence (HAI)研究中心发布了《2024年人工智能指数报告》。 由斯坦福大学发起的人工智能指数&#xff08;AI Index&#xff09;是一个追踪 AI 动态和进展的非营利性项目&#xff0c;旨在全面研究 AI 行业状况&#xf…

物联网的核心价值是什么?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网&#xff0c;这个词汇在当今的科技领域已经变得耳熟能详。但当我们深入探索物联网的核心价值时&#xff0c;我们会发现它远不止是一个简单的技术概念&#xff0c;而是一种能够彻底改变我们生活方式和工作方式的革命性力量。 物联网…

libcurl 简单使用

LibCurl是一个开源的免费的多协议数据传输开源库&#xff0c;该框架具备跨平台性&#xff0c;开源免费&#xff0c;并提供了包括HTTP、FTP、SMTP、POP3等协议的功能&#xff0c;使用libcurl可以方便地进行网络数据传输操作&#xff0c;如发送HTTP请求、下载文件、发送电子邮件等…

C语言基础入门案例(3)

目录 第一题&#xff1a;一维数组的最大值和最小值求解 第二题&#xff1a;求一维数组中的第二大的数 第三题&#xff1a;计算5个整数的平均值 第四题&#xff1a;查找整数在数组中的索引位置 第五题&#xff1a;统计字符串中数字字符的个数 第一题&#xff1a;一维数组的…

服务器Linux搭建NPM私有仓库

服务器Linux搭建NPM私有仓库 环境搭建 安装 nodejs nodejs官网&#xff1a;https://nodejs.org/en/download/package-manager 可以去官网自行下载nodejs的Linux版本&#xff0c;但是出于别的原因考虑&#xff0c;可以使用nvm去下载nodejs这样会切换nodejs也方便。 nvm 这…

MySQL进阶-----limit、count、update优化

目录 前言 一、limit优化 1. 未优化案例 2.优化后案例 二、count优化 count用法 三、update优化 1.锁行情况&#xff08;有索引&#xff09; 2.锁表情况&#xff08;无索引&#xff09; 前言 上一期我们学习了order by优化和group by优化&#xff0c;本期我们就继续学习…

程序员接单的渠道有没有可靠介绍?

程序员接单的渠道有很多&#xff0c;但总结下来无非就是个人介绍和程序员接单平台。 这里就不多说废话了&#xff0c;直接上当前市面上靠谱且稳定的程序员接单平台list。 程序员客栈 近100w程序员都在使用的程序员接单平台。作为一个靠谱的线上接单渠道&#xff0c;程序员客栈…