首先列举一下socket网络通信的例子:使用局域网打游戏,用浏览器连接外网看视频,使用QQ与好友通信,手机连接wifi传数据等等。socket是底层抽象给应用层所使用的一套接口函数,本篇讲解这些函数的使用。
对象:
- 服务器server(等待客户端连接)
- 客户端client(主动连接服务器)
对象之间的联系:
client是根据server的‘’ip地址+端口号”找到对方并建立连接的
2025年07月16日
首先列举一下socket网络通信的例子:使用局域网打游戏,用浏览器连接外网看视频,使用QQ与好友通信,手机连接wifi传数据等等。socket是底层抽象给应用层所使用的一套接口函数,本篇讲解这些函数的使用。
对象:
对象之间的联系:
client是根据server的‘’ip地址+端口号”找到对方并建立连接的
2025年07月16日
前言
本文研究如何在AP模式下进行TCP Client通信,所谓AP模式是说模块起来一个softAP热点,可以供其他WIFI设备连接,当其他设备连接成功后,另WIFI模块作为客户端,局域网中其他设备作为服务端进行TCP数据通信。
一、理论基础
本节要处理的有两个问题,其一是如何利用RT_Thread起来一个softAP,其二是如何使用Socket套接字编程搞定TCP Client程序编写。
2025年07月16日
这篇教程主要是告诉大家如何利用TCP和HTTP协议来完成网站的搭建。
首先你需要有C/C++语言基础,且有服务器、客户端概念,如果你了解TCP或者HTTP协议的话,那么将会帮助你更快的学会如何搭建个人网站。
该服务器使用的Windows中的IOCP模式来进行,我将put代码中最为重要的几个部分
1.准备好HTML文件,也就是你所要发布的网页,可以是静态网页也可以是动态网页,为了更好的帮助大家入门,我准备了一个最为简便的html代码如下:
2025年07月16日
近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡。一共fork了20个Server进程,在请求负载中等的时候,有三四个Server进程呈现出比较高的CPU利用率,其余的Server进程的CPU利用率都是非常低。
中断,软中断都是均衡的,网卡RSS和CPU之间进行了bind之后依然如故,既然系统层面查不出个所以然,只能从服务的角度来查了。
自上而下的排查首先就想到了strace,没想到一下子就暴露了原形:
2025年07月16日
RTP数据包构成格式:
RTP数据包一般由:Header+有效载荷数据:构成,Header一般为12字节,有效载荷数据则可以是音频数据,h264码流,PS码流等等
2025年07月16日
以下server和client的c代码均拷贝自博客,详细内容请阅读原文。在其上添加了错误码打印,修改了服务端ip和端口,并增加了makefile脚本。
2025年07月16日
一、TCP连接建立与系统调用基础
(一)TCP连接建立过程概述
1. 三次握手
TCP连接建立是基于三次握手机制。首先,客户端向服务器发送一个带有SYN(同步序列号)标志的数据包,请求建立连接。这个数据包中包含了客户端初始的序列号。
2025年07月16日
产生RST的三个条件:
1. 目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;
2. TCP想取消一个已有的连接;
3. TCP接收到一个根本不存在的连接上的分节;
现在模拟上面的三种情况:
client:
2025年07月16日
我们首先来看一个最简单的TCP服务端、客户端的例子,服务端在端口8080等待连接,客户端发起连接,连接成功后发送“Hello,Server”,然后关闭连接;服务端接收客户端的消息并打印,然后关闭连接。
服务端代码:
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <cstring>
#include <iostream>
#include <string>
#define PORT 8080 // 要监听的端口号
#define MAX_CONN 5 // 最大并发连接数
int main() {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(struct sockaddr_in);
char buffer[1024];
// 创建一个套接字
if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Failed to create socket." << std::endl;
return -1;
}
// 设置地址结构
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定套接字到指定IP和端口
if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) <
0) {
std::cerr << "Failed to bind socket." << std::endl;
close(server_sock);
return -1;
}
// 开始监听连接请求
if (listen(server_sock, MAX_CONN) < 0) {
std::cerr << "Failed to listen on socket." << std::endl;
close(server_sock);
return -1;
}
std::cout << "Server is listening on port " << PORT << std::endl;
while (true) {
// 接受新的连接请求
if ((client_sock = accept(server_sock, (struct sockaddr*)&client_addr,
&addr_len)) < 0) {
std::cerr << "Failed to accept connection." << std::endl;
continue;
}
std::cout << "Accepted connection from: " << inet_ntoa(client_addr.sin_addr)
<< ":" << ntohs(client_addr.sin_port) << std::endl;
// 接收客户端发送的数据
ssize_t n = recv(client_sock, buffer, sizeof(buffer), 0);
if (n < 0) {
std::cerr << "Failed to receive data from client." << std::endl;
close(client_sock);
continue;
}
buffer[n] = '\0'; // 添加字符串结束符
std::cout << "Received message: " << buffer << std::endl;
// 关闭客户端连接
close(client_sock);
}
// 关闭服务器套接字
close(server_sock);
return 0;
}