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

企业标准化建设优化关键词排名软件

企业标准化建设,优化关键词排名软件,网页设计论文目录,高端建设网站建设套接字(Socket): 通过网络实现跨机通信 作用:一种文件描述符传输层的文件描述符 整个编程中,需要着重注意htonl/htons、ntohl/ntohs、inet_addr等 TCP的C/S实现 循环服务器模型 TCP服务器实现过程 1.创建套接字&a…

套接字(Socket):

通过网络实现跨机通信

作用:一种文件描述符传输层的文件描述符

整个编程中,需要着重注意htonl/htons、ntohl/ntohs、inet_addr等

TCP的C/S实现


循环服务器模型

TCP服务器实现过程

1.创建套接字:

初始化结构体struct sockaddr_in

2.给套接字绑定ip地址和端口号:bind函数

#include <netinet/in.h>

3.将套接字文件描述符,从主动变为被动文件描述符(做监听准备——listen函数)

4.accept函数:被动监听客户的连接并响应        【实现三次握手(无客户端连接,则会阻塞)】

5.服务器调用read(recv)和write(send)函数————SIGPIPE忽略

recv的返回值等于0的时候,证明客户端已经关闭

6.注意事项:

        字节序转换:

发送数据:将主机端序转为网络端序

接收数据:将网络端序转为主机端序

7.调用close或者shutdown关闭TCP连接

close:

缺点1:一次性将读写都关闭——只想关写(读),打开写(读),就实现不了

缺点2:如果多个文件猫述符指向了同一个连接时。如果只close关闭了其中某个文件猫述符时只要其它的fd还打开着,那么连接不会被断开。直到所有的描述符都被close后才断开连接
出现多个描述指向同一个连接的原因可能两个:
1.通过dup方式复制出其它描述符
2.子进程维承了这个描述符,所以子进程的描述符也指向了连接

shutdown:

可以全关掉

  • shutdown(套接字描述符)会关闭整个套接字的发送和接收功能,不管是否有连接建立。
  • shutdown(一个连接描述符)只会关闭与该连接相关的发送和接收功能,不会影响其他连接或套接字描述符。
  • close(套接字描述符)会完全关闭套接字描述符,释放与之相关的资源,并将描述符标记为无效。
  • close(一个连接描述符)的概念上并不存在,连接描述符通常是由套接字描述符派生出来的,因此关闭连接描述符时实际上是关闭了套接字描述符。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h> //*******//
#include <netinet/in.h> //*******//
#include <arpa/inet.h>  //*******//
#include <unistd.h>
#include <signal.h>
int sockfd;
void my_exit(int sig)
{shutdown(sockfd, SHUT_RDWR);close(sockfd);printf("shutdown socket done\n");exit(0);
}
void handle(int sig) // SIGPIPE的信号处理函数————以观察是否产生了SIGPIPE信号
{if (sig == SIGPIPE){printf("SIGPIPE is going\n");}
}int main(int argc, char **argv)
{signal(SIGINT, my_exit);signal(SIGPIPE, handle);signal(SIGPIPE, SIG_IGN);// 1.sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socked is error");exit(-1);}printf("socket success\n");// setsockopt函数int i;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));// 2.struct sockaddr_in sockaddr_in1;sockaddr_in1.sin_family = AF_INET; // IPV4// “5555”可以用宏定义sockaddr_in1.sin_port = htons(4443);                         // 正确的做法是使用htons函数将主机字节序转换为网络字节序————htons而非htonl因为端口号是16位sockaddr_in1.sin_addr.s_addr = inet_addr("192.168.106.128"); //*****//if (bind(sockfd, (struct sockaddr *)&sockaddr_in1, sizeof(sockaddr_in1)) < 0){perror("bind error");exit(-1);}printf("bind success\n");// 3.if (listen(sockfd, 20) < 0){perror("listen error");exit(-1);}printf("listen success\n");// 4.struct sockaddr_in addr2;int len_addr2 = sizeof(addr2);while (1){// 强制类型转换int sock_fd1 = accept(sockfd, (struct sockaddr *)&addr2, &len_addr2); // 每来一个客户端的连接请求,就会生成一个描述符,只要知道这个描述符,就能通过此通信if (sock_fd1 < 0){perror("accept error");exit(-1);}printf("client ip = %s ,port = %d\n", inet_ntoa(addr2.sin_addr), ntohs(addr2.sin_port)); // 1.inet_ntoa把ip地址转换为字符————2.把网络的转换为主机的// 5.char buffer[1024] = {0};int recv_t = recv(sock_fd1, buffer, sizeof(buffer) - 1, 0);printf("recv_t : %d   ", recv_t);if (recv_t < 0){perror("recv error");exit(-1);}else if (recv_t == 0) // recv的返回值为零的时候,证明客户端关闭了!{printf("client is closed\n");}else{printf("recv :%s\n", buffer);while (1){memset(buffer, 0, sizeof(buffer));scanf("%s", buffer);// int w_t = send(sock_fd1, buffer, strlen(buffer), 0);int w_t = send(sock_fd1, buffer, strlen(buffer), MSG_NOSIGNAL); // MSG_NOSIGNAL:表示此操作不愿被SIGPIPE信号断开;或注册信号处理函数if (w_t < 0){perror("send data error");exit(-1);}}}shutdown(sock_fd1, SHUT_RDWR);}return 0;
}
8.setsockopt函数

主要用在服务器端:

【当有客服端连接到服务器的时候,此时服务器端按下ctrl + c,断开连接,此时需要等待2MSL,才能再次用原来的ip和端口号新建客户端,为了去除这种等待2MSL的】

SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上

setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));-CSDN博客

9.在socket()和bind()调用之间,使用下列代码——防止客户端关闭时,要等2MSL的时间

TCP客服端的实现过程

client.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <signal.h>
#include <unistd.h>int main(int argc, char **argv)
{if (argc != 3){perror("input error");exit(-1);}int socket_fd = socket(AF_INET, SOCK_STREAM, 0);if (socket_fd < 0){perror("socket error");exit(-1);}struct sockaddr_in addr_in1;addr_in1.sin_family = AF_INET;addr_in1.sin_addr.s_addr = inet_addr(argv[1]);addr_in1.sin_port = htons(atoi(argv[2]));if (connect(socket_fd, (struct sockaddr *)&addr_in1, sizeof(addr_in1)) == 0){printf("connect ok\n");}else{printf("connect error\n");}while (1){char buffer[1024];memset(buffer, 0, sizeof(buffer));scanf("%s", buffer);write(socket_fd, buffer, strlen(buffer) + 1);memset(buffer, 0, sizeof(buffer));read(socket_fd, buffer, sizeof(buffer));printf("%s", buffer);}return 0;
}

UDP的C/S实现

UDP协议没有建立连接特性,所以UDP协议没有自动记录对方IP和端口的特点,每次发
送数据时,必须亲自指定对方的IP和端口,只有这样才能将数据发送给对方。

 

UDP通信过程

1.调用socket创建套接字文件

2.bind绑定固定的ip和端口

3.调用sendto和recvfrom函数,发送和接收数据

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main(int argc, char **argv)
{// if (argc != 3)// {//     printf("input error\n");//     exit(-1);// }// 1.int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);if (sock_fd < 0){perror("socket error");exit(-1);}// 2.struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");addr.sin_port = htons(5554);if (bind(sock_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0){perror("bind error");exit(-1);}// 3.struct sockaddr_in addr2;int addr2_len = sizeof(addr2);addr2.sin_family = AF_INET;addr2.sin_addr.s_addr = inet_addr(argv[1]);addr2.sin_port = htons(atoi(argv[2]));while (1){char buffer[1024];scanf("%s", buffer);int ret = sendto(sock_fd, buffer, strlen(buffer) + 1,0, (struct sockaddr *)&addr2, addr2_len);if (ret < 0){perror("sendto error");exit(-1);}}return 0;
}#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main(int argc, char **argv)
{// 1.int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);if (sock_fd < 0){perror("socket error");exit(-1);}// 2.struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");addr.sin_port = htons(5555);if (bind(sock_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0){perror("bind error");exit(-1);}// 3.struct sockaddr_in addr2;memset(&addr2, 0, sizeof(addr2));int addr2_len = sizeof(addr2);char buffer[1024] = {0};while (1){int ret = recvfrom(sock_fd, buffer, sizeof(buffer),0, (struct sockaddr *)&addr2, &addr2_len);if (ret < 0){perror("recvfrom error");exit(-1);}printf("from ip = %s ,from port = %d \n", inet_ntoa(addr2.sin_addr), ntohs(addr2.sin_port));printf("recv message = %s \n", buffer);}return 0;
}

运行结果:

广播


一个人发,然后其它所有人都接收,这就是广播。


广播只能在局域网内部有效,广播数据是无法越过路由器的,也就是说路由器就是广播数据的边界。 广播只能在局域网内部有效,广播数据是无法越过路由器的,也就是说路由器就是广播数据的边界。


实现方法:

1.广播的发数据,不需要绑定自己的IP地址

2.ip地址写成广播地址;例如:192.168.1.255

3.接收端的ip地址,不能设置为固定ip,要指定为htons(INADDR_ANY)

4.接收方需要setsockopt函数,设置套接字文件可以重复绑定

   addr1.sin_addr.s_addr = htons(INADDR_ANY);//为什么是htons和htonl!!!!
广播发送:无需bind#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, char **argv)
{int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);if (sock_fd < 0){perror("socket error");exit(-1);}//*****************************************************************************//int j = 1;setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (void *)&j, sizeof(j));//*****************************************************************************//struct sockaddr_in addr1;addr1.sin_family = AF_INET;addr1.sin_addr.s_addr = inet_addr("127.0.0.255");addr1.sin_port = htons(5555);while (1){char buffer[1024] = {0};scanf("%s", buffer);sendto(sock_fd, buffer, sizeof(buffer),0, (struct sockaddr *)&addr1, sizeof(addr1));}return 0;
}接受广播:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, char **argv)
{int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);if (sock_fd < 0){perror("socket error");exit(-1);}int j = 1;setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &j, sizeof(j));struct sockaddr_in addr1;addr1.sin_family = AF_INET;//*****************************************************************************//addr1.sin_addr.s_addr = htons(INADDR_ANY);//为什么是htons和htonl!!!!//*****************************************************************************//addr1.sin_port = htons(5555);int ret = bind(sock_fd, (struct sockaddr *)&addr1, sizeof(addr1));if (ret < 0){perror("bind error");exit(-1);}struct sockaddr_in addr2;int len = sizeof(addr2);memset(&addr2, 0, sizeof(addr2));char buffer[1024];while (1){memset(buffer, 0, sizeof(buffer));recvfrom(sock_fd, buffer, sizeof(buffer),0, (struct sockaddr *)&addr2, &len);printf("recv %s\n", buffer);}return 0;
}

组播

把一些ip设置为一个组,给这些组,发消息(后续在QT里涉及到

http://www.mmbaike.com/news/43813.html

相关文章:

  • 行业门户型网站制作平台广告推广
  • 住房与城乡建设部网站注册中心百度一下网页版搜索引擎
  • 中职专业设计网站网络推广服务
  • 建设机械网站精英凡科网免费建站
  • 设计一套企业网站设计报价软文是什么意思通俗点
  • 手机网站无响应怎么建立自己的网站平台
  • 中文儿童网站模板网站建设及网络推广
  • 海外广告投放公司宁波seo公司推荐
  • ecs怎么添加wordpress太原百度搜索排名优化
  • 企业网站搜索推广全球中文网站排名
  • 微信建设网站哪家好网站批量收录
  • 没有网站怎么做链接视频教程品牌网络seo方案外包
  • 毕业设计网站怎么做足球最新世界排名表
  • 家纺 网站建设 中企动力潍坊网站建设解决方案
  • 招聘网站简历数据分析怎么做新冠病毒最新消息
  • 想要提高网站排名应该怎么做免费网络推广网站
  • wordpress部署文件夹灰色关键词排名优化
  • 事业单位网站建设计划微信引流获客软件
  • 长沙网站制作公司推荐线上营销推广的公司
  • 高端网站建设网页设计百度广告投放价格
  • 博物馆 网站 建设电子商务是干什么的
  • 青岛怎样做网站中国seo
  • 池州网站制作哪家好网站查询站长工具
  • 铁路工程造价信息网重庆网站seo建设哪家好
  • 代做视频的网站好seo优化关键词0
  • 东阿做网站站长网站查询
  • 做翻译的网站关键词权重
  • 个人网站建设哪家好网络舆情分析
  • 2022当下社会热点话题seo整站优化解决方案
  • php如何创建站点谷歌推广新手教程