96SEO 2026-02-19 20:44 0
没有拥塞控制因此网络出现拥塞不会使源主机的发送速率降低对实时应用很有用如

来区分不同的服务的。
端口提供了一种访问通道服务器一般都是通过知名端口号来识别的。
例如对于每个
字节序即字节在电脑中存放时的序列与输入输出时的序列是先到的在前还是后到的在前。
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
//返回主机字节序的值h代表host主机n代表nets代表short两个字节l代表long4个字节通过上面的4个函数可以实现主机字节序和网络字节序之间的转换。
有时可以用INADDR_ANYINADDR_ANY指定地址让操作系统自己获取
创建套接字socket为套接字添加信息IP地址和端口号bind监听网络连接listen监听到有客户端接入接受一个连接accept数据交互read、write、read关闭套接字断开连接close
把字符串形式的“192.168.1.123”转为网络能识别的格式char*
{//也可在linux/in.h中找到__kernel_sa_family_t
*addrlen);//fd,客户端地址客户端地址长度地址返回新的建立的socket的通道
因特网域TCP协议自动选择type类型对应的默认协议也可用宏IPPROTO_TCP
-1){//判断建立socket通道是否成功perror(socket);//把错误的问题打出来exit(-1);//退出这个程序}//2.
AF_INET;//协议族跟domain一致s_addr.sin_port
htons(8989);//端口号一般3000以下为操作系统来用建议用户5000以上
返回网络字节序的值inet_aton(192.168.2.13,s_addr.sin_addr);//本机ip地址由字符串形式to网络格式//ifconfigbind(s_fd,(struct
sockaddr_in));//把ip地址端口号和s_fd绑定起来//fd,强转为struct
listenlisten(s_fd,10);//监听10个连接不阻塞//4.
accept(s_fd,NULL,NULL);//先不关心客户端是谁//如果没连接到会卡在这//后续的操作用新的c_fd//5.
writeprintf(connected!\n);while(1)//有客户端连上不让其退出return
设置需要一分钟左右的时间不要关闭。
安装完成后重启计算机生效。
实测可不重启
windows功能的telnet功能已经开启我们测试下是否可以正常使用输入telnetip地址。
*addrlen);//fd,客户端地址客户端地址长度返回新的建立的socket的通道
bindmemset(s_addr,0,sizeof(struct
sockaddr_in));//清空memset(c_addr,0,sizeof(struct
因特网域TCP协议自动选择type类型对应的默认协议也可用宏IPPROTO_TCP
-1){//判断建立socket通道是否成功perror(socket);//把错误的问题打出来exit(-1);//退出这个程序}//2.
AF_INET;//协议族跟domain一致s_addr.sin_port
htons(8989);//端口号一般3000以下为操作系统来用建议用户5000以上
返回网络字节序的值inet_aton(192.168.2.13,s_addr.sin_addr);//本机ip地址由字符串形式to网络格式//ifconfigbind(s_fd,(struct
sockaddr_in));//把ip地址端口号和s_fd绑定起来//3.
listenlisten(s_fd,10);//监听10个连接//4.
*)c_addr,clen);//如果没连接到会卡在这if(c_fd
%s\n,inet_ntoa(c_addr.sin_addr));//连上后打印
-1){perror(read);}else{printf(get
message:%d,%s\n,n_read,readBuf);//打印收到了多少个字节的消息和消息的内容}//6.
writewrite(c_fd,msg,strlen(msg));//用提前定义的字符串如直接写入字符串字节大小也随意写如128,会造成乱码因有无用的字节return
-1){perror(socket);exit(-1);}//2.connect//连接服务器
c_addr;memset(c_addr,0,sizeof(struct
sockaddr_in));c_addr.sin_family
htons(8989);inet_aton(192.168.2.13,c_addr.sin_addr);//服务器的ip地址if(connect(c_fd,
-1){//连接时会阻塞直到出结果为之perror(connect);exit(-1);}//3.
write//写write(c_fd,msg,strlen(msg));//4.
-1){perror(read);}else{printf(get
server:%d,%s\n,n_read,readBuf);//打印收到了多少个字节的消息和消息的内容}return
SOCKET/server3.c服务器可以一直接收多个客户端的连接并和某个客户端互发消息
*addrlen);//fd,客户端地址客户端地址长度返回新的建立的socket的通道
bindmemset(s_addr,0,sizeof(struct
sockaddr_in));memset(c_addr,0,sizeof(struct
因特网域TCP协议自动选择type类型对应的默认协议也可用宏IPPROTO_TCP
-1){//判断建立socket通道是否成功perror(socket);//把错误的问题打出来exit(-1);//退出这个程序}//2.
AF_INET;//协议族跟domain一致s_addr.sin_port
htons(atoi(argv[2]));//字符串转换为整形数inet_aton(argv[1],s_addr.sin_addr);//本机ip地址由字符串形式to网络格式//ifconfigbind(s_fd,(struct
sockaddr_in));//把ip地址端口号和s_fd绑定起来//3.
listenlisten(s_fd,10);//监听10个连接//4.
一直循环进行//不要在while(1)里定义变量//同时收和发c_fd
*)c_addr,clen);//如果没连接到会卡在这if(c_fd
%s\n,inet_ntoa(c_addr.sin_addr));//连上后打印
当这种请求到达时父进程调用fork使子进程处理此请求。
父进程则继续等待下一个服务请求到达//6.
writeif(fork()0){//如果要用两个while(1)要么用多线程要么用fork创建子进程while(1){memset(msg,0,sizeof(msg));printf(input:
);//gets(msg);//gets不安全,已经被废弃fgets(msg,sizeof(msg),stdin);//阻塞msg[strcspn(msg,
\0;//移除输入中的换行符write(c_fd,msg,strlen(msg));//6.
readwhile(1){memset(readBuf,0,sizeof(readBuf));//每次写之前清空n_read
-1){perror(read);}else{printf(get
client:%d,%s\n,n_read,readBuf);//打印收到了多少个字节的消息和消息的内容}}}}return
}SOCKET/client2.c多个客户端分别连接服务器并和服务器互发消息
-1){perror(socket);exit(-1);}//2.connect
c_addr;memset(c_addr,0,sizeof(struct
sockaddr_in));c_addr.sin_family
htons(atoi(argv[2]));inet_aton(argv[1],c_addr.sin_addr);//服务器的ip地址if(connect(c_fd,
成功后往下perror(connect);exit(-1);}while(1){//不让程序退出
写if(fork()0){//如果要用两个while(1)要么用多线程要么用fork创建子进程while(1){memset(msg,0,sizeof(msg));//每次写之前清空printf(input:
);//gets(msg);//gets不安全,已经被废弃fgets(msg,sizeof(msg),stdin);//阻塞msg[strcspn(msg,
\0;//移除输入中的换行符write(c_fd,msg,strlen(msg));}}//4.
读while(1){memset(readBuf,0,sizeof(readBuf));n_read
-1){perror(read);}else{printf(get
server:%d,%s\n,n_read,readBuf);//打印收到了多少个字节的消息和消息的内容}}}return
上节课的逻辑shell终端获得输入并不知道是哪个子进程的输入所以返回给客户端也并不知道是哪个子进程之间存在资源竞争
SOCKET/server4.c自动主动回复给客户端消息类似心跳包
*addrlen);//fd,客户端地址客户端地址长度返回新的建立的socket的通道
bindmemset(s_addr,0,sizeof(struct
sockaddr_in));memset(c_addr,0,sizeof(struct
因特网域TCP协议自动选择type类型对应的默认协议也可用宏IPPROTO_TCP
-1){//判断建立socket通道是否成功perror(socket);//把错误的问题打出来exit(-1);//退出这个程序}//2.
AF_INET;//协议族跟domain一致s_addr.sin_port
htons(atoi(argv[2]));//字符串转换为整形数inet_aton(argv[1],s_addr.sin_addr);//本机ip地址由字符串形式to网络格式//ifconfigbind(s_fd,(struct
sockaddr_in));//把ip地址端口号和s_fd绑定起来//3.
listenlisten(s_fd,10);//监听10个连接//4.
一直循环进行//不要在while(1)里定义变量//同时收和发c_fd
*)c_addr,clen);//如果没连接到会卡在这if(c_fd
-1){perror(accept);}mark;printf(get
%s\n,inet_ntoa(c_addr.sin_addr));//连上后打印
当这种请求到达时父进程调用fork使子进程处理此请求。
父进程则继续等待下一个服务请求到达//一有客户端接入就调用子进程//6.
writeif(fork()0){//如果要用两个while(1)要么用多线程要么用fork创建子进程while(1){sprintf(msg,welcome
Client,mark);//每个客户端都能知道其连接有无丢失write(c_fd,msg,strlen(msg));//6.
write//对于服务端都能收到客户端的请求sleep(3);//类似心跳包每隔3s发一串话}
readwhile(1){//接收每一个客户端发来的消息memset(readBuf,0,sizeof(readBuf));//每次写之前清空n_read
-1){perror(read);}else{printf(get
:%d,%s\n,mark,n_read,readBuf);//打印收到了多少个字节的消息和消息的内容}}}}return
als展示服务器有哪些文件和文件夹pwd显示当前文件夹所在路径lcd
就可以多次读其返回值等0时表示客户端连接断开小于0读数据失败read
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback