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

做网站空间500m多少钱网络营销的重要性与意义

做网站空间500m多少钱,网络营销的重要性与意义,自己做的网站打开特慢,php网站开发技术 pdf文章目录 零、效果展示一、服务器代码二、客户端代码三、知识点1.connect()2.socket()3.bind()4.send()5.recv() 四、改进方向五、跟练视频 零、效果展示 一个服务器作为中转站,多个客户端之间可以相互通信。至少需要启动两个客户端。 三个客户端互相通信 一、服务…

文章目录

    • 零、效果展示
    • 一、服务器代码
    • 二、客户端代码
    • 三、知识点
      • 1.connect()
      • 2.socket()
      • 3.bind()
      • 4.send()
      • 5.recv()
    • 四、改进方向
    • 五、跟练视频

零、效果展示

一个服务器作为中转站,多个客户端之间可以相互通信。至少需要启动两个客户端。

在这里插入图片描述


三个客户端互相通信
在这里插入图片描述


一、服务器代码

chatServer.cpp

函数:socket()、bind()、listen()、accept()、read()、write()

#include <cstdio>
#include <iostream>
#include <string>
#include <sys/epoll.h>  //epoll的头文件
#include <sys/socket.h> //socket的头文件
#include <unistd.h>     //close()的头文件
#include <netinet/in.h> //包含结构体 sockaddr_in
#include <map>          //保存客户端信息
#include <arpa/inet.h>  //提供inet_ntoa函数
using namespace std;const int MAX_CONNECT = 5; //全局静态变量,允许的最大连接数struct Client{int sockfd; //socket file descriptor 套接字文件描述符 string username;
};int main(){//创建一个epoll实例int epfd = epoll_create1(0); //或老版本 epoll_create(1);if(epfd < 0){perror("epoll create error");return -1;}//创建监听的socketint sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){ //若socket创建失败,则返回-1perror("socket error");return -1;}//绑定本地ip和端口struct sockaddr_in addr;  //结构体声明,头文件是<netinet/in.h>addr.sin_family = AF_INET;addr.sin_addr.s_addr = htonl(INADDR_ANY);addr.sin_port  = htons(9999);int ret = bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));if(ret < 0){printf("bind error\n");cout << "该端口号已被占用,请检查服务器是否已经启动。" << endl;return -1;}cout << "服务器中转站已启动,请加入客户端。" << endl;//监听客户端ret = listen(sockfd,1024);if(ret < 0){printf("listen error\n");return -1;}//将监听的socket加入epollstruct epoll_event ev;ev.events = EPOLLIN;ev.data.fd = sockfd;ret = epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&ev); //防御性编程,方便出bug时快速定位问题if(ret < 0){printf("epoll_ctl error\n");return -1;}//保存客户端信息map<int,Client> clients;int clientCount = 0; //添加一个客户端计数器//循环监听while(true){struct epoll_event evs[MAX_CONNECT];int n = epoll_wait(epfd,evs,MAX_CONNECT,-1);if(n < 0){printf("epoll_wait error\n");break;}for(int i = 0; i < n; i ++){int fd = evs[i].data.fd;//如果是监听的fd收到消息,则表示有客户端进行连接了if(fd == sockfd){struct sockaddr_in client_addr;socklen_t client_addr_len = sizeof(client_addr);int client_sockfd = accept(sockfd, (struct sockaddr*) & client_addr, &client_addr_len);if(client_sockfd < 0){printf("accept error,连接出错\n");continue;}//将客户端的socket加入epollstruct epoll_event ev_client;ev_client.events = EPOLLIN; //检测客户端有没有消息过来ev_client.data.fd = client_sockfd;ret = epoll_ctl(epfd, EPOLL_CTL_ADD,client_sockfd,&ev_client);if(ret < 0){printf("epoll_ctl error\n");break;} //iner_ntoa() 将客户端的IP地址从网络字节顺序转换为点分十进制字符串clientCount++; //有新的客户端加入时,增加计数器printf("客户端%d已连接: IP地址为 %s\n", clientCount, inet_ntoa(client_addr.sin_addr));//保存该客户端信息Client client;client.sockfd = client_sockfd;client.username = "";clients[client_sockfd] = client;}else{char buffer[1024];int n = read(fd, buffer, 1024);if(n < 0){break; //处理错误}else if(n == 0){//客户端断开连接close(fd);epoll_ctl(epfd,EPOLL_CTL_DEL, fd ,0);clients.erase(fd);}else{ // n > 0string msg(buffer,n);//如果该客户端username为空,说明该消息是这个客户端的用户名if(clients[fd].username == ""){clients[fd].username = msg;}else{string name = clients[fd].username;//把消息发给其他所有客户端for(auto &c:clients){if(c.first != fd){string full_message = '[' + name + ']' + ':' + msg;write(c.first, full_message.c_str(), full_message.length());//write(c.first,('[' + name + ']' + ":" + msg).c_str(),msg.size() + name.size() + 4);}}}}}}}//关闭epoll实例close(epfd);close(sockfd);return 0;
}

二、客户端代码

client.cpp (注意g++编译时要加 -pthread)

函数:socket()、connect()、send()、recv()

#include <cstdio>
#include <iostream> 
#include <cstring>       //memset()的头文件
#include <sys/socket.h>  //socket(),connect()等函数的头文件
#include <netinet/in.h>  //sockaddr_in的头文件
#include <arpa/inet.h>   //inet_pton()函数的头文件
#include <unistd.h>      //close()函数的头文件
#include <pthread.h>     //pthread创建线程和管理线程的头文件
using namespace std;#define BUF_SIZE 1024
char szMsg[BUF_SIZE];//发送消息
void* SendMsg(void *arg){int sock = *((int*)arg);while(1){//scanf("%s",szMsg);fgets(szMsg,BUF_SIZE,stdin); //使用fgets代替scanfif(szMsg[strlen(szMsg) - 1] == '\n'){szMsg[strlen(szMsg)- 1] = '\0'; //去除换行符}if(!strcmp(szMsg,"QUIT\n") || !strcmp(szMsg,"quit\n")){close(sock);exit(0);}send(sock, szMsg, strlen(szMsg), 0);}return nullptr;
}//接收消息
void* RecvMsg(void * arg){int sock = *((int*)arg);char msg[BUF_SIZE];while(1){int len = recv(sock, msg, sizeof(msg)-1, 0);if(len == -1){cout << "系统挂了" << endl;return (void*)-1;}msg[len] = '\0';printf("%s\n",msg);}return nullptr;
}int main()
{//创建socketint hSock;hSock = socket(AF_INET, SOCK_STREAM, 0);if(hSock < 0){perror("socket creation failed");return -1;}//绑定端口sockaddr_in servAdr;memset(&servAdr, 0, sizeof(servAdr));servAdr.sin_family = AF_INET;servAdr.sin_port = htons(9999);if(inet_pton(AF_INET, "172.16.51.88", &servAdr.sin_addr) <= 0){perror("Invalid address");return -1;}//连接到服务器if(connect(hSock, (struct sockaddr*)&servAdr, sizeof(servAdr)) < 0){perror("连接服务器失败");cout << "请检查是否已启动服务器。" << endl;return -1;}else{printf("已连接到服务器,IP地址:%s,端口:%d\n", inet_ntoa(servAdr.sin_addr), ntohs(servAdr.sin_port));printf("欢迎来到私人聊天室,请输入你的聊天用户名:");}//创建线程pthread_t sendThread,recvThread;if(pthread_create(&sendThread, NULL, SendMsg, (void*)&hSock)){perror("创建发送消息线程失败");return -1;}if(pthread_create(&recvThread, NULL, RecvMsg, (void*)&hSock)){perror("创建接收消息线程失败");return -1;}//等待线程结束pthread_join(sendThread, NULL);pthread_join(recvThread, NULL);//关闭socketclose(hSock);return 0;
}

三、知识点

1.connect()

在这里插入图片描述

在这里插入图片描述


#include <sys/types.h>
#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

connect()成功返回0,失败返回-1


以下是一个简单的 TCP 客户端示例,展示了如何使用 connect() 连接到服务器:

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("Socket creation failed");return -1;}struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(12345);  // 服务器监听的端口inet_pton(AF_INET, "192.168.1.100", &server_addr.sin_addr);  // 服务器的IP地址if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("Connection failed");return -1;}printf("Connected to the server\n");// 之后可以使用sockfd进行数据传输close(sockfd);  // 关闭套接字return 0;
}

在这个示例中,客户端程序创建了一个套接字,设置服务器的 IP 地址和端口,然后尝试与服务器建立连接。如果 connect() 调用成功,客户端就与服务器建立了连接,并可以通过该套接字进行数据通信。


2.socket()

1.参数

int socket(int address_family, int type, int protocol);

(1)address family:
AF_INET:IPv4 网络协议。用于TCP/IP和UDP/IP网络通信。
②AF_INET6:IPv6 网络协议。用于TCP/IP和UDP/IP网络通信,但支持IPv6地址。
③AF_UNIX(或AF_LOCAL):本地通道通信。用于在同一台机器上的进程间通信。

2)type:
SOCK_STREAM:TCP协议,提供面向连接的稳定数据传输,保证数据能够按顺序、完整地到达。
②SOCK_DGRAM:UDP协议,提供无连接的数据传输服务。发送的是独立的消息,不保证顺序或数据完整性。
③SOCK_RAW:提供原始网络协议访问。在网络模型中,这种类型的套接字允许直接访问IP层,通常用于网络协议的开发和测试。

(3)protocol:默认协议填0


2.返回值:
①成功时,socket() 返回一个非负整数,即新创建的套接字文件描述符。
②出错时,返回 -1,并设置全局变量 errno 以表示具体的错误类型。


3.创建一个使用IPv4地址和TCP协议的套接字:

int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {perror("socket creation failed");
}

这里,AF_INET 指定使用IPv4地址,SOCK_STREAM 指定使用面向连接的数据传输方式(TCP),0 表示自动选择使用TCP协议。


在这里插入图片描述


3.bind()

在这里插入图片描述

在这里插入图片描述


4.send()

发送数据:将数据放到发送缓冲区。由内核决定什么时候将数据发送出去。

在这里插入图片描述

在这里插入图片描述


5.recv()

接收数据:当数据送到Linux内核后,数据不是立即给到应用程序,而是放在接收缓冲区,等应用程序什么时候调用recv()函数,什么时候才由内核给到应用程序。
在这里插入图片描述


四、改进方向

1.做的Linux端,只能在相同的IP上启动几个客户端自己玩。
后续可以做成Windows的exe,买个云服务器,然后发给朋友,进行通信。


五、跟练视频

陈子青多人聊天室-C/C++ 多人聊天室开发-epoll模型的IO多路复用

http://www.tj-hxxt.cn/news/1601.html

相关文章:

  • 广州网页设计公司网站网站设计公司官网
  • 差异基因做聚类分析网站交换链接案例
  • 南充建网站百度推广代理查询
  • 静态展示网站模板bt磁力
  • 江阴网站建设多少钱网站流量分析工具
  • 内蒙古创意星空网站开发app拉新推广一手接单平台
  • 最新新闻热点300字seo属于技术还是营销
  • 南通做企业网站营销渠道策划方案
  • 网站文化制度建设免费推广网站视频
  • 网站如何做服务器授权软件排名工具
  • 郑州网站seo外包公司app推广项目
  • 做网站时怎样图片上传怎么才能让图片不变形_有什么插件吗爱站网关键词查询网站
  • 行业推广做哪个网站好百度推广开户费用多少
  • 做数模必逛的网站百度推广收费多少
  • 网站推广公司哪seo人员培训
  • dedecms做中英文网站网络营销与传统营销有哪些区别
  • ppt模板免费下载免费使用上海关键词优化排名哪家好
  • 古城做网站的公司网站设计公司排行榜
  • 做外卖那些网站好网络推广是什么工作
  • 哪些网站做代理商最近大事件新闻
  • 如何制作软件界面seo哪家好
  • cpa没有网站怎么做网站seo优化检测
  • 广州网站建设高端网seo店铺描述例子
  • 网站要怎么做关键词广州网站营销seo费用
  • 北京网站建设哪家公司好北京网站优化指导
  • 做网站搜索框搜索引擎外部优化有哪些渠道
  • wordpress post请求安徽360优化
  • 个人网站欣赏的网站网络营销是什么意思?
  • 移动建站平台百度云网盘官网
  • 建站宝盒哪个牌子好十大嵌入式培训机构