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

建设淘宝客网站.lc和ev关键词列表

建设淘宝客网站.lc和ev,关键词列表,wordpress查看版本号,电脑自己做网站可以吗套接字#xff08;Socket#xff09;#xff1a; 通过网络实现跨机通信 作用#xff1a;一种文件描述符传输层的文件描述符 整个编程中#xff0c;需要着重注意htonl/htons、ntohl/ntohs、inet_addr等 TCP的C/S实现 循环服务器模型 TCP服务器实现过程 1.创建套接字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.服务器调用readrecv和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.hint 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要指定为htonsINADDR_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.hint 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.hint 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.dnsts.com.cn/news/70780.html

相关文章:

  • 学会了dw就可以做网站吗腾讯云可以做网站吗
  • 邢台提供网站建设公司电话郑州做网站公司msgg
  • 山西太原建设厅官方网站网站建设推来客在哪里
  • 网站怎么添加音乐保定电商网站建设
  • 免费网站制作效果网易企业邮箱登录入口手机
  • 郑州h5网站建设有的网站打不开 但别人电脑能打开
  • 东莞网站推广软件海口网站建设专家评价
  • 安徽省建设法治协会网站杭州装修公司哪家好
  • 广州网站优化地址大数据技术就业和发展前景
  • 成都制作手机网站微营销
  • 宁海县建设局网站下属单位wordpress 新特性
  • 官网模板建站塔山双喜网站的域名用文字搜索怎么做
  • 营销型网站设计案例互动网站
  • 网站根目录相对路径湖北省建设工程信息网官网
  • 昆明网站推广专员wordpress加入ai
  • 平面设计师看的网站做同城服务网站比较成功的网站
  • 做网站可以用什么软件微信app官网下载
  • 那些网站是html5做的网站建设培训要多久
  • 漳州市建设网站校园文创产品设计
  • 局域网建立网站教程广州网络推广招聘
  • 网站开发工程师考试网页设计总结分析
  • 网站跟app的区别导购网站一站式建站
  • 哈尔滨行业网站建设策划夏门建设局网站
  • 如何做镜像网站重庆百度seo公司
  • 做电影网站心得体会营销网络用语是什么意思
  • 成都公司网站设计哪家专业织梦一键更新网站
  • 做海外网站的公司哪个网站可以做结婚请柬
  • 重庆邮电大学官网网站flash工作室网站模板
  • 网站开发搭建合同范本只有域名如何做网站
  • win7在局域网做网站濮阳网络电视台直播