网网站建设公司系统开发总结

web/2025/10/4 14:26:16/文章来源:
网网站建设公司,系统开发总结,淘宝网官方网站购物商城,山东城市建设职业学院图书馆网站Linux中的socket 服务端逻辑客户端逻辑c实现c实现服务端持续接收请求多线程实现 UDP实现 参考 服务端逻辑 创建service_sock创建sockaddr_in结构体变量serv_addr#xff0c;写明端口和ip将socket和结构体绑定监听socket创建客户端sockaddr_in结构体变量clnt_addr接收客户端请… Linux中的socket 服务端逻辑客户端逻辑c实现c实现服务端持续接收请求多线程实现 UDP实现 参考 服务端逻辑 创建service_sock创建sockaddr_in结构体变量serv_addr写明端口和ip将socket和结构体绑定监听socket创建客户端sockaddr_in结构体变量clnt_addr接收客户端请求创建新的clnt_sock客户端信息保存在clnt_addr中向客户端发送数据关闭clnt_sock关闭serv_sock 客户端逻辑 创建sock创建sockaddr_in结构体变量serv_addr写明端口和ip将socket和serv_addr作为参数调用connect方法调用read方法读取服务端传来的数据关闭sock c实现 clien.c #include stdio.h //printf,sprintf,perror 相关声明在此文件中 #include string.h //memset,strlen #include unistd.h //close #include arpa/inet.h //sockaddr_in,socket,AF_INET,SOCK_STREAM,htons,inet_addr,connect,sockaddr,send,recv //相关定义和声明在此文件中#define MAX_CONN 2 #define BUF_SIZE 1024 #define PORT 9000int main(int argc, char *argv[]) {printf(argc is %d \n, argc);int i;for (i 0; iargc; i){printf(arcv[%d] is %s\n, i, argv[i]);}struct sockaddr_in server_sai;int sfd 0, res -1, recvbytes 0, sendbytes 0;char buf[BUF_SIZE], buf2[5] {0}; // 进行变量的定义和初始化if (argc 3) // 如果参数小于3个就报错命令后面会分别加上IP地址和消息内容所以一共是三个参数{printf(error number of argc:%d\n, argc);return res;}memset(buf, 0, sizeof(buf)); // 对buf清零sprintf(buf, %s, argv[2]); // 将要传输的内容(第二个参数)复制到buf中if (-1 (sfd socket(AF_INET, SOCK_STREAM, 0))) // 创建一个IPV4的TCP socket{perror(socket);return res;}server_sai.sin_family AF_INET; // IPV4 协议族server_sai.sin_port htons(PORT); // 9000端口server_sai.sin_addr.s_addr inet_addr(argv[1]); // 使用第一个参数作为IP地址memset((server_sai.sin_zero), 0, sizeof(server_sai.sin_zero)); // 将结构体剩余部分填零if (-1 connect(sfd, (struct sockaddr *)server_sai, sizeof(struct sockaddr))) // 使用sfd进行连接{perror(connect);return res;}if (-1 (sendbytes send(sfd, buf, strlen(buf), 0))) // 将buf中的内容写到远端服务端buf中的内容是命令行中的第二个参数{perror(send);return res;}recvbytes recv(sfd, buf2, 5, 0); // 从服务端接收数据写到buf2中printf(%d --%s\n, recvbytes, buf2); // 将buf2中的数据显示出来close(sfd); // 进行清理工作关闭描述符res 0;return res; } server.c #include stdio.h //perror,printf 相关函数在此声明 #include netinet/in.h //sockaddr_in,htons,htonl,socket,AF_INET,SOCK_STREAM,INADDR_ANY,SOL_SOCKET,SO_REUSEADDR,bind,listen,accept,recv,send 相关声明和定义在这个文件中 #include string.h //memset 相关函数在此声明 #include unistd.h //close 相关函数在此声明#define MAX_CONN 2 #define BUF_SIZE 1024 #define PORT 9000int main() {struct sockaddr_in server_sai, client_sai;int sfd 0, cfd 0, res -1, on 1, recvbytes 0, sendbytes 0;int addrlen sizeof(struct sockaddr);char buf[BUF_SIZE]; // 各种变量定义与初始化if (-1 (sfd socket(AF_INET, SOCK_STREAM, 0))) // 创建一个IPV4的TCP socket{perror(socket);return res;}server_sai.sin_family AF_INET; // IPV4 协议族server_sai.sin_port htons(PORT); // 9000端口server_sai.sin_addr.s_addr htonl(INADDR_ANY); // 0.0.0.0 的通配监听memset((server_sai.sin_zero), 0, sizeof(server_sai.sin_zero)); // 将剩余部分填零setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, on, sizeof(on)); // closesocket一般不会立即关闭而经历TIME_WAIT的过程后想继续重用该socketif (-1 bind(sfd, (struct sockaddr *)server_sai, sizeof(struct sockaddr))) // 将 sfd 和 socket 地址进行绑定{perror(bind);return res;}if (-1 (listen(sfd, MAX_CONN))) // 在sfd上进行监听最多允许同时有2个请求在队列中排队此配置正是DDOS的攻击点协议天然的缺陷在于不论这个值设多设少都不会是一个适合的值{perror(listen);return res;}elseprintf(Listening...\n);if (-1 (cfd accept(sfd, (struct sockaddr *)client_sai, (socklen_t *)addrlen))) // 接受连接将返回的描述符赋给cfd{perror(accept);return res;}memset(buf, 0, sizeof(buf)); // 将缓存置零if (-1 (recvbytes recv(cfd, buf, BUF_SIZE, 0))) // 从对端接受内容并且存到buf中{perror(recv);return res;}printf(Received a message:%s\n, buf); // 将收到的内容输出if (-1 (sendbytes send(cfd, OK, 2, 0))) // 给客户端回复一个ok{perror(send);return res;}close(sfd);close(cfd); // 进行清理关闭打开的描述符res 0;return res; } c实现 clien.cpp #include stdio.h #include string.h #include stdlib.h #include unistd.h #include arpa/inet.h #include sys/socket.h int main(){//创建套接字int sock socket(AF_INET, SOCK_STREAM, 0);//向服务器特定的IP和端口发起请求struct sockaddr_in serv_addr;memset(serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充serv_addr.sin_family AF_INET; //使用IPv4地址serv_addr.sin_addr.s_addr inet_addr(127.0.0.1); //具体的IP地址serv_addr.sin_port htons(1234); //端口connect(sock, (struct sockaddr*)serv_addr, sizeof(serv_addr));//读取服务器传回的数据char buffer[40];read(sock, buffer, sizeof(buffer)-1);printf(Message form server: %s\n, buffer);//关闭套接字close(sock);return 0; } server.cpp #include stdio.h #include string.h #include stdlib.h #include unistd.h #include arpa/inet.h #include sys/socket.h #include netinet/in.h #include iostream int main(){//创建套接字int serv_sock socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//将套接字和IP、端口绑定struct sockaddr_in serv_addr;memset(serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充serv_addr.sin_family AF_INET; //使用IPv4地址serv_addr.sin_addr.s_addr inet_addr(127.0.0.1); //具体的IP地址serv_addr.sin_port htons(1234); //端口bind(serv_sock, (struct sockaddr*)serv_addr, sizeof(serv_addr));//进入监听状态等待用户发起请求listen(serv_sock, 20);//接收客户端请求struct sockaddr_in clnt_addr;socklen_t clnt_addr_size sizeof(clnt_addr);int clnt_sock accept(serv_sock, (struct sockaddr*)clnt_addr, clnt_addr_size);// 打印收到的客户端地址端口信息std::cout Client address: inet_ntoa(clnt_addr.sin_addr) , port: ntohs(clnt_addr.sin_port) std::endl;//向客户端发送数据char str[] http://c.biancheng.net/socket/;write(clnt_sock, str, sizeof(str));//关闭套接字close(clnt_sock);close(serv_sock);return 0; } 服务端持续接收请求 服务端持续接收客户端请求其实就是加了个while循环 #include arpa/inet.h #include iostream #include netinet/in.h #include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include unistd.h int main() {//创建套接字int serv_sock socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//将套接字和IP、端口绑定struct sockaddr_in serv_addr;memset(serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充serv_addr.sin_family AF_INET; //使用IPv4地址serv_addr.sin_addr.s_addr inet_addr(127.0.0.1); //具体的IP地址serv_addr.sin_port htons(1234); //端口bind(serv_sock, (struct sockaddr *)serv_addr, sizeof(serv_addr));//进入监听状态等待用户发起请求listen(serv_sock, 20);while (true) {//接收客户端请求struct sockaddr_in clnt_addr;socklen_t clnt_addr_size sizeof(clnt_addr);int clnt_sock accept(serv_sock, (struct sockaddr *)clnt_addr, clnt_addr_size);// 打印收到的客户端地址端口信息std::cout Client address: inet_ntoa(clnt_addr.sin_addr) , port: ntohs(clnt_addr.sin_port) std::endl;//向客户端发送数据char str[] http://c.biancheng.net/socket/;write(clnt_sock, str, sizeof(str));//关闭套接字close(clnt_sock);}close(serv_sock);return 0; } 多线程实现 client.cpp #include arpa/inet.h #include arpa/inet.h #include errno.h #include error.h #include iostream #include netinet/in.h #include pthread.h #include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include sys/types.h #include unistd.h void *recvsocket(void *arg) //接受来自服务端数据的线程 {int st *(int *)arg;char s[1024];while (1) {memset(s, 0, sizeof(s));int rc recv(st, s, sizeof(s), 0);if (rc 0) //代表socket被关闭0或者出错-1{break;}printf(client receive:%s\n, s);}return NULL; } void *sendsocket(void *arg) //向服务端socket发送数据的线程 {int st *(int *)arg;char s[1024];while (1) {memset(s, 0, sizeof(s));scanf(%s, s);int sc send(st, s, strlen(s), 0);} } //执行 ./ClientLinux.out 127.0.0.1 8080 int main(int arg, char *args[]) {if (arg 3) {printf(arg3\n);return -1;}int port atoi(args[2]);//第一步初始化一个socket实例int st socket(AF_INET, SOCK_STREAM, 0);//第二步定义一个IP地址结构并设置值struct sockaddr_in addr;//内存初始化将addr变量指向的内存签n个字节用0进行初始化填充memset(addr, 0, sizeof(addr));//设置采用的协议为TCP/IP协议addr.sin_family AF_INET;//设置端口号addr.sin_port htons(port);//设置IP地址addr.sin_addr.s_addr inet_addr(args[1]);//第三步开始连接服务端if (connect(st, (struct sockaddr *)addr, sizeof(addr)) -1) {printf(connect fail %s\n, strerror(errno));return EXIT_FAILURE;}//第四步初始化要发送的信息并且通过send函数发送数据pthread_t thrd1, thrd2; //定义一个线程pthread_create(thrd1, NULL, recvsocket, st);pthread_create(thrd2, NULL, sendsocket, st);std::cout thrd1 thrd1 std::endl;std::cout thrd2 thrd2 std::endl;pthread_join(thrd1, NULL);pthread_join(thrd2, NULL);close(st);getchar();return EXIT_SUCCESS; } server.cpp #include stdio.h #include stdlib.h #include errno.h #include sys/socket.h #include sys/types.h #include netinet/in.h #include string.h #includearpa/inet.h #include error.h #include unistd.h #include arpa/inet.h #include netinet/in.h #include pthread.h void* recvsocket(void* arg)//接受来着客户端数据的线程 {int st *(int*)arg;char s[1024];while (1){memset(s, 0, sizeof(s));int rc recv(st, s, sizeof(s), 0);if (rc 0)//代表socket被关闭0或者出错-1{printf(sercver recv fail:%d\n, rc);break;}printf(server receive:%s\n, s);}return NULL; } void* sendsocket(void* arg)//向客户端socket发送数据的线程 {int st *(int*)arg;char s[1024];while (1){memset(s, 0, sizeof(s));scanf(%s, s);int sc send(st, s, strlen(s), 0);} } //执行命令 ./ServerLinux.out 8080 int main(int arg, char* args[]) {if (arg 2){return -1;}int port atoi(args[1]);int st socket(AF_INET, SOCK_STREAM, 0);//setsockopt 设置socket的一个属性让地址可以重用。int on 0;if (setsockopt(st, SOL_SOCKET, SO_REUSEADDR, on, sizeof(on)) -1){printf(setsockopt failed:%s\n, strerror(errno));return EXIT_FAILURE;}struct sockaddr_in addr;memset(addr, 0, sizeof(addr));addr.sin_family AF_INET;addr.sin_port htons(port);//INADDR_ANY表示这个服务器上的所有Ip地址。一台服务器可以有多个ip地址。将socket绑定到这个机器的所有ip地址上addr.sin_addr.s_addr htonl(INADDR_ANY);//将ip地址与server程序绑定if (bind(st, (struct sockaddr*) addr, sizeof(addr)) -1){printf(bind fail %s\n, strerror(errno));return EXIT_FAILURE;}//server开始监听。 20代表同时有多少个连接过来20并发if (listen(st, 20) -1){printf(listen fail %s\n, strerror(errno));return EXIT_FAILURE;}//char s[1024];int client_st 0;//客户端socketstruct sockaddr_in client_addr;//客户端IPpthread_t thrd1, thrd2;//定义一个线程while (1){memset(client_addr, 0, sizeof(client_addr));socklen_t len sizeof(client_addr);//accept会阻塞直到有客户端连接过来。accept返回客户端的描述符client_st accept(st, (struct sockaddr*) client_addr, len);if (client_st -1){printf(accept fail %s\n, strerror(errno));return EXIT_FAILURE;}//打印客户端的ip地址printf(accept ip : %s\n, inet_ntoa(client_addr.sin_addr));pthread_create(thrd1, NULL, recvsocket, client_st);pthread_create(thrd2, NULL, sendsocket, client_st);}close(st);getchar(); } UDP实现 udpclient.cpp #include arpa/inet.h #include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include unistd.h#define BUF_SIZE 100 int main() {//创建套接字int sock socket(PF_INET, SOCK_DGRAM, 0);//服务器地址信息struct sockaddr_in serv_addr;memset(serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充serv_addr.sin_family PF_INET;serv_addr.sin_addr.s_addr inet_addr(127.0.0.1);serv_addr.sin_port htons(1234);//不断获取用户输入并发送给服务器然后接受服务器数据struct sockaddr_in fromAddr;socklen_t addrLen sizeof(fromAddr);while (1) {char buffer[BUF_SIZE] {0};printf(Input a string: );fgets(buffer, BUF_SIZE, stdin);sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr *)serv_addr,sizeof(serv_addr));int strLen recvfrom(sock, buffer, BUF_SIZE, 0,(struct sockaddr *)fromAddr, addrLen);buffer[strLen] 0;printf(Message form server: %s\n, buffer);}close(sock);return 0; } udpserver.cpp #include arpa/inet.h #include iostream #include netinet/in.h #include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include unistd.h#define BUF_SIZE 100 int main() {//创建套接字int serv_sock socket(AF_INET, SOCK_DGRAM, 0);//绑定套接字struct sockaddr_in serv_addr;memset(serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充serv_addr.sin_family PF_INET; //使用IPv4地址serv_addr.sin_addr.s_addr htonl(INADDR_ANY); //自动获取IP地址serv_addr.sin_port htons(1234); //端口bind(serv_sock, (struct sockaddr *)serv_addr, sizeof(serv_addr));//接收客户端请求struct sockaddr_in clnt_addr; //客户端地址信息socklen_t clnt_addr_size sizeof(clnt_addr);char buffer[BUF_SIZE]; //缓冲区while (1) {int strLen recvfrom(serv_sock, buffer, BUF_SIZE, 0,(struct sockaddr *)clnt_addr, clnt_addr_size);//打印客户端的ip地址printf(accept ip : %s\n, inet_ntoa(clnt_addr.sin_addr));char message[] I am server !;sendto(serv_sock, message, strlen(message), 0, (struct sockaddr *)clnt_addr,clnt_addr_size);// sendto(serv_sock, buffer, strLen, 0, (struct sockaddr *)clnt_addr,// clnt_addr_size);}close(serv_sock);return 0; }socket通信过程中读/写和单线程/多线程中都会存在阻塞问题可以根据输出验证。比如上面注释的一行sendto反注释掉的话会交替打印两个send信息。

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

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

相关文章

怎样把自己做的网站上传河南火焰山网站开发禹

EasyJson是Go语言中对象序列化与反序列化的工具,类似Java中的fastjson和Jackson,能快速对对象进行序列化和反序列化,本次介绍一下使用方法。 版本信息: go1.20.2 1,获取源码 # go get go get -u github.com/mailru…

网站建设怎么做账务处理创卫网站 建设 方案

目录 写在开头 socket服务端(基础) socket客户端(基础) 服务端实现(可连接多个客户端) 客户端实现 数据收发效果 写在开头 近期可能会用python实现一些网络安全工具,涉及到许多关于网络…

易购商城网站怎么做啊专门做卫生间效果图的网站

309.最佳买卖股票时机含冷冻期 309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) dp数组: 模拟状态:买买买 卖 冻卖卖卖 买 卖 dp[i][0] :持有股票 dp[i][1]: 不持有股票,但是之前卖出去的 dp[i][2]: 不持有股票…

南宁网站平台大专动漫设计有出路吗

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 启动工程失败,报错如题: A component required a bean of type gentle.test.Show that could not be found.…

织梦网站后台文章编辑美化代码怎样创建公司网站

介绍 定义了一个Cache结构体,其中使用sync.Map作为底层数据结构来存储缓存项。Set方法用于设置缓存项,指定键、值以及过期时间。Get方法用于获取缓存项,如果缓存项存在且未过期,则返回值和true,否则返回nil和false。方…

建设网站公开教学视频下载做图表用的网站

前言:博主文章仅用于学习、研究和交流目的,不足和错误之处在所难免,希望大家能够批评指出,博主核实后马上更改。 概述: 后续排序按照从上至下或从右至左的顺序进行,具体取决于方向属性的值。WrapPanel 位…

营销网站开发哪家强wordpress副标题的作用

从一篇日记说起我是一个小前端,我有写日记的习惯2020年10月17 天气 晴今天天气不错,心情也跟着好起来了辛辛苦苦加班两个星期终于完成了产品需求,到了要上线的时候了,嘴里也不知不觉哼起了“劳资今晚不加班”的小曲一顿操作猛如虎…

网站空间文件夹网络工程就业前景好吗

直接判断数据过大 相对而言&#xff0c;由2&#xff0c;3&#xff0c;5&#xff0c;7组成的数更少&#xff0c;则先筛选出由2,3,5,7组成的数&#xff0c;再判断这些数中的质数个数即可 #include <iostream> using namespace std; int main() {printf("1903");…

网站买卖交易平台网站制作工具有哪些

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…

做tcf法语听力题的网站动漫制作专业在广西哪所院校最强

高中那年&#xff0c;我表姐对我说&#xff1a;“不要老想着出去打工赚钱&#xff0c;好好读书&#xff0c;将来肯定有用&#xff0c;也不要想着现在日子长得很&#xff0c;等你像我这样结婚生子后&#xff0c;一天一眨眼就过完了。”当时听了没有多大感觉&#xff0c;如今深以…

企业网站中( )是第一位的。织梦网站怎么做404页面

一、获取当前窗口句柄 1.元素有属性&#xff0c;浏览器的窗口其实也有属性的&#xff0c;只是你看不到&#xff0c;浏览器窗口的属性用句柄&#xff08;handle&#xff09;来识别。 2.人为操作的话&#xff0c;可以通过眼睛看&#xff0c;识别不同的窗口点击切换。但是脚本没长…

长沙网站的建设h5响应式 wordpress

方法一&#xff1a;ssh 方法二&#xff1a;commandK进入远程桌面&#xff0c;这种方式类似于windwos下的远程桌面 转载于:https://www.cnblogs.com/xiyuan2016/p/9020978.html

邵阳营销型网站建设网页游戏排行力荐新壹玩

前言 Redis 的 RDB 持久化机制简单直接&#xff0c;把某一时刻的所有键值对以二进制的方式写入到磁盘&#xff0c;特点是恢复速度快&#xff0c;尤其适合数据备份、主从复制场景。但如果你的目的是要保证数据可靠性&#xff0c;RDB 就不太适合了&#xff0c;因为 RDB 持久化不…

西安高端品牌网站wang域名的网站

列表 列表的元素 有序列表&#xff1a;ol、li无序列表&#xff1a;ul、li自定义列表&#xff1a;dl dt dd 自定义列表 dl 定义列表&#xff0c;直接元素只能是dt、dd dt 列表中每一项的项目名 dd 列表的每一项的具体描述 表格 table 表格border-collapse:collapse; (塌陷的…

上海红酒网站建设沈阳工程建设监理咨询

文章目录 Batch Normalizationinternal covariate shift激活层的作用BN执行的位置数据白化网络中的BN层训练过程 BN的实验效果MNIST与GoogleLeNet V1比较 GoogleLeNet出来之后&#xff0c;Google在这个基础上又演进了几个版本&#xff0c;一般来说是说有4个版本&#xff0c;之前…

与安网站建设广州短视频网站开发

国外主流还是使用apache&#xff1b;国内现在主流是nginx&#xff08;并发能力强&#xff0c;相对稳定&#xff09; nginx&#xff1a;高性能、轻量级的web服务软件 特点&#xff1a; 1.稳定性高&#xff08;没apache稳&#xff09;&#xff1b; 2.系统资源消耗比较低&#xf…

一些设计网站投票链接制作

运行示例项目报错缺少dll&#xff0c;发现运用了这个大老李&#xff0c;通过添加PATH路径也无法解决&#xff0c;看到debug文件夹下面没有其他的依赖项。 通过depneds工具可以看到 OCCTProxy_D3D.dll 缺少依赖项&#xff0c;图中的缺项都是OCCT生成的模块dll所以讲这些dll从..…

商城网站建设价位asp.net门户网站项目怎么做

本文转载自公众号: 美团技术团队.作为人工智能时代最重要的知识表示方式之一&#xff0c;知识图谱能够打破不同场景下的数据隔离&#xff0c;为搜索、推荐、问答、解释与决策等应用提供基础支撑。美团大脑围绕吃喝玩乐等多种场景&#xff0c;构建了生活娱乐领域超大规模的知识图…

站内推广方案公司部门名字大全

2016年五一杯数学建模 C题 二孩政策问题 原题再现 多年来实施的严、紧计划生育政策对控制人口增长起到关键作用。在优生优育政策的指引下&#xff0c;我国人口质量显著提高&#xff0c;但也带来了不利影响&#xff0c;生育率偏低、男女比例失衡、人口老龄化情况严重等问题。2…

郑州网站app建设微信应用平台开发

如果调试是消除软件错误的过程&#xff0c;那么编程一定是添加错误的过程。Edsger Dijkstra。来自 https://www.azquotes.com/quote/561997 一、说明 在这篇文章中&#xff0c;我想谈谈 TensorFlow 中的调试。 在之前的一些帖子&#xff08;此处、此处和此处&#xff09;中&…