
C++基于TCP和UDP的socket通信
SYN包:客户端发送SYN包(同步序列数),表示请求建立连接。 SYN-ACK包:服务器回复SYN-ACK包,确认客户端请求。 ACK包:客户端发送ACK包,确认连接成功。
发布日期:2021-05-19 20:28:52
浏览次数:21
分类:精选文章
本文共 2597 字,大约阅读时间需要 8 分钟。
TCP和UDP属于传输层协议。TCP提供可靠的数据传输,通过三次握手建立连接;而UDP不保证可靠性,一般用于实时传输,如音视频流。
TCP三次握手解析
TCP的连接建立涉及三次握手:
整个过程在C语言的connect()
、bind()
、listen()
和accept()
函数中完成。
TCP注意事项
- TIME_WAIT状态:连接关闭后仍占用端口时间最长为4分钟。这可能导致服务器重新启动时出现服务冲突。
- 解决方法:在
bind()
前使用setsockopt()
函数取消绑定。
UDP特点
UDP不保证数据可靠性,容易丢包。适用于对实时性要求高的场景如视频流传输。
实用代码示例
服务端
#include#include #pragma comment(lib, "ws2_32.lib")void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MakeWord(1, 1); err = WSAStartup(&wVersionRequested, &wsaData); if (err != 0) return; if (LOBYTE(waData.wVersion) != 1 || HIBYTE(waData.wVersion) != 1) { WSACleanup(); return; } SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(4000); bind(sockSrv, (SOCKADDR_IN*)&addrSrv, sizeof(SOCKADDR)); listen(sockSrv, 5); while(1) { SOCKET sockConn = accept(sockSrv, (SOCKADDR_IN*)&addrClt, (int*)&len); char sendBuf[50]; sprintf(sendBuf, "Welcome %s to here!", inet_ntoa(addrClt.sin_addr)); send(sockConn, sendBuf, strlen(sendBuf)+1, 0); char recvBuf[50]; recv(sockConn, recvBuf, 50, 0); printf("%s\n", recvBuf); closesocket(sockConn); Sleep(2000); } WSACleanup();}
客户端
#include#include #pragma comment(lib, "ws2_32.lib")void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MakeWord(1, 1); err = WSAStartup(&wVersionRequested, &wsaData); if (err != 0) return; if (LOBYTE(waData.wVersion) != 1 || HIBYTE(waData.wVersion) != 1) { WSACleanup(); return; } for(int index=0;;index++) { SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0); SOCKADDR_IN local; local.sin_addr.S_un.S_addr = inet_addr("192.168.0.30"); local.sin_family = AF_INET; local.sin_port = htons(27015); sendto(sockClient, (char*)"", 2, 0, (SOCKADDR_IN*)&local, sizeof(SOCKADDR)); char recvBuf[50]; recvfrom(sockClient, recvBuf, 50, 0, (SOCKADDR_IN*)&local, (int*)&len); printf("my reply is: %s\n", recvBuf); closesocket(sockClient); Sleep(2000); } WSACleanup();}
其他注意事项
- 多线程编程:在多线程环境中使用socket时,要注意线程安全。
- 拥塞控制:TCP使用拥塞控制算法,避免网络流量过载。
- 大文件传输:对于大文件,建议使用Selective Acknowledgment(SACK)等协议确保可靠传输。
如需进一步探讨socket编程或优化,欢迎留言交流!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年05月11日 20时37分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kubernetes对接Ceph存储实现云原生持久化
2023-01-29
Kubernetes对象Service详解
2023-01-29
kubernetes常用工具
2023-01-29
Kubernetes快速上手:部署、使用及核心概念解析
2023-01-29
Kubernetes故障排查与面试汇总
2023-01-29
Kubernetes故障排查实战
2023-01-29
kubernetes混合云平台运维实战项目分享
2023-01-29
Kubernetes灰度发布实战:滚动更新的奥秘与策略,带你领略无缝升级的艺术
2023-01-29
kubernetes社区项目生态概览
2023-01-29
Kubernetes网络插件使用详解
2023-01-29
kubernetes调度pod运行于master节点上
2023-01-29
Kubernetes调度单位Pod
2023-01-29
Kubernetes部署Dashboard实战
2023-01-29
Kubernetes部署Deployment实例详解
2023-01-29
kubernetes部署nacos2.3.0
2023-01-29
Kubernetes集群升级实战
2023-01-29
kubernetes集群添加到jumpserver堡垒机里管理
2023-01-29