C++网络编程核心是Socket操作,流程为创建→绑定/连接→收发→关闭;服务端用socket/bind/listen/accept监听连接,客户端调用connect发起连接;需注意字节序、错误检查、TCP粘包及跨平台差异。

用C++做网络编程,核心就是操作Socket套接字——它像一扇门,让程序能收发数据。Windows和Linux系统调用略有不同,但基本流程一致:创建套接字→绑定地址(服务端)或直接连接(客户端)→收发数据→关闭。
服务端:监听并响应连接
服务端要先准备好“等待别人敲门”的状态。关键步骤是socket()、bind()、listen()、accept()。绑定时需指定IP和端口,0.0.0.0表示监听所有网卡;端口建议选1024以上避免权限问题。
- 用AF_INET指定IPv4,SOCK_STREAM表示TCP可靠连接
- 调用setsockopt()设置SO_REUSEADDR,防止重启时报“地址已在使用”
- accept()会阻塞,直到有客户端连上来,返回一个新套接字专用于和该客户端通信
客户端:主动发起连接
客户端更简单:创建套接字→填好服务器IP和端口→调用connect()。成功后就能用send()/recv()收发数据了。
- IP地址可用inet_addr("127.0.0.1")转为网络字节序,端口用htons(8080)
- connect()失败时检查errno(Linux)或WSAGetLastError()(Windows)
- 别忘了在程序开头调用WSAStartup()(Windows),结束时WSACleanup()
收发数据:注意阻塞与边界
TCP是字节流,没有天然消息边界。recv()可能一次只读到部分数据,也可能把多次send()合并成一次返回。不能假设“发一次就收一次”。
立即学习“C++免费学习笔记(深入)”;
- 用循环读取直到收到完整协议头,再按长度读取正文(比如自定义包头含4字节长度字段)
- send()返回值必须检查——它不保证一次发完所有数据,剩余部分得手动重发
- 对文本协议(如HTTP、自定义指令),可用\n或\r\n作分隔符,配合std::string::find()拆包
跨平台小提醒
Linux直接用unistd.h和sys/socket.h;Windows要用winsock2.h,且需链接ws2_32.lib。封装一层简单的Socket类,把差异藏起来,后续扩展就轻松多了。
基本上就这些。不复杂但容易忽略细节,比如忘记初始化、没检查返回值、混淆主机/网络字节序——写几遍就熟了。











