网络编程学习记录
- 使用的语言为C/C++
- 源码支持的平台为:Windows
笔记一:建立基础TCP服务端/客户端 点我跳转
笔记二:网络数据报文的收发 点我跳转
笔记三:升级为select网络模型 点我跳转
笔记四:跨平台支持Windows、Linux系统 点我跳转
笔记五:源码的封装 点我跳转
笔记六:缓冲区溢出与粘包分包 点我跳转
笔记七:服务端多线程分离业务处理高负载 点我跳转
笔记八:对socket select网络模型的优化 点我跳转
笔记九:消息接收与发送分离 点我跳转
笔记十:项目化 (加入内存池静态库 / 报文动态库) 更多笔记请点我
笔记一
- 网络编程学习记录
- 一、建立简易TCP服务端
- 二、建立简易TCP客户端
- 三、建立可持续处理请求的网络程序
一、建立简易TCP服务端
1.建立服务端大致流程
- 建立一个套接字 (socket)
- 绑定客户端连接的端口 (bind)
- 监听网络端口 (listen)
- 等待接受客户端连接 (accept)
- 接收客户端发送的数据 (recv)
- 向客户端发送数据 (send)
- 关闭套接字 (closesocket)
2.代码实现以及详细注释
#define WIN32_LEAN_AND_MEAN#include
#include
#include#pragma comment(lib,"ws2_32.lib")using namespace std; int main()
{WORD ver &#61; MAKEWORD(2,2);WSADATA dat;if(0 !&#61; WSAStartup(ver,&dat)){return 0;}SOCKET _mysocket &#61; socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET &#61;&#61; _mysocket){ return 0; } sockaddr_in _myaddr &#61; {};_myaddr.sin_family &#61; AF_INET;_myaddr.sin_port &#61; htons(8888);_myaddr.sin_addr.S_un.S_addr &#61; inet_addr("127.0.0.1");if(SOCKET_ERROR &#61;&#61; bind(_mysocket,(sockaddr*)&_myaddr,sizeof(sockaddr_in))){cout<<"绑定不成功"<<endl;}else{
二、建立简易TCP客户端
1.建立客户端大致流程
- 建立一个套接字 &#xff08;socket&#xff09;
- 连接服务器 &#xff08;connect&#xff09;
- 向客户端发送数据 &#xff08;send&#xff09;
- 接收客户端发送的数据 &#xff08;recv&#xff09;
- 关闭套接字 &#xff08;closesocket&#xff09;
2.代码实现以及详细注释
#define WIN32_LEAN_AND_MEAN#include
#include
#include#pragma comment(lib,"ws2_32.lib")using namespace std; int main()
{WORD ver &#61; MAKEWORD(2,2);WSADATA dat;if(0 !&#61; WSAStartup(ver,&dat)){return 0;}SOCKET _mysocket &#61; socket(AF_INET,SOCK_STREAM,0);if(INVALID_SOCKET &#61;&#61; _mysocket){ return 0; } sockaddr_in _sin &#61; {};_sin.sin_family &#61; AF_INET;_sin.sin_port &#61; htons(8888);_sin.sin_addr.S_un.S_addr &#61; inet_addr("127.0.0.1");if(SOCKET_ERROR &#61;&#61; connect(_mysocket,(sockaddr*)&_sin,sizeof(sockaddr_in))){cout<<"连接失败"<<endl;closesocket(_mysocket);}else{cout<<"连接成功"<<endl; }char _msg[] &#61; "HelloServer";send(_mysocket,_msg,strlen(_msg)&#43;1,0);char _buf[256] &#61; {};int _buf_len &#61; recv(_mysocket,_buf,256,0);if(_buf_len>0){printf("%s\n",_buf);}closesocket(_mysocket); WSACleanup(); return 0;
}
三、建立可持续处理请求的网络程序
1.思路
在进行socket连接后&#xff0c;即服务端进行accept操作、客户端进行connect操作后&#xff0c;使用循环&#xff0c;在此循环中进行send/recv操作传输数据&#xff0c;即可实现持续处理请求。
2.代码实现以及详细注释
2.1 服务端代码
#define WIN32_LEAN_AND_MEAN#include
#include
#include#pragma comment(lib,"ws2_32.lib")using namespace std; int main()
{WORD ver &#61; MAKEWORD(2,2);WSADATA dat;if(0 !&#61; WSAStartup(ver,&dat)){return 0;}SOCKET _mysocket &#61; socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET &#61;&#61; _mysocket){ return 0; } sockaddr_in _myaddr &#61; {};_myaddr.sin_family &#61; AF_INET;_myaddr.sin_port &#61; htons(8888);_myaddr.sin_addr.S_un.S_addr &#61; inet_addr("127.0.0.1");if(SOCKET_ERROR &#61;&#61; bind(_mysocket,(sockaddr*)&_myaddr,sizeof(sockaddr_in))){cout<<"绑定不成功"<<endl;}else{
2.2 客户端代码
#define WIN32_LEAN_AND_MEAN#include
#include
#include#pragma comment(lib,"ws2_32.lib")using namespace std; int main()
{WORD ver &#61; MAKEWORD(2,2);WSADATA dat;if(0 !&#61; WSAStartup(ver,&dat)){return 0;}SOCKET _mysocket &#61; socket(AF_INET,SOCK_STREAM,0);if(INVALID_SOCKET &#61;&#61; _mysocket){ return 0; } sockaddr_in _sin &#61; {};_sin.sin_family &#61; AF_INET;_sin.sin_port &#61; htons(8888);_sin.sin_addr.S_un.S_addr &#61; inet_addr("127.0.0.1");if(SOCKET_ERROR &#61;&#61; connect(_mysocket,(sockaddr*)&_sin,sizeof(sockaddr_in))){cout<<"连接失败"<<endl;closesocket(_mysocket);}else{cout<<"连接成功"<<endl; }while(true){char _msg[256] &#61; {};scanf("%s",_msg);if(0 &#61;&#61; strcmp(_msg,"exit")){break;}else{send(_mysocket,_msg,strlen(_msg)&#43;1,0);}char _buf[256] &#61; {};int _buf_len &#61; recv(_mysocket,_buf,256,0);if(_buf_len>0){printf("%s\n",_buf);}}closesocket(_mysocket); WSACleanup(); return 0;
}