
最简单网络编程Socket(TCP/UDP)Demo教程
下载需积分: 34 | 57.77MB |
更新于2025-03-25
| 124 浏览量 | 举报
1
收藏
网络编程是计算机程序之间进行通信的重要手段,它允许计算机通过网络发送和接收数据。Socket编程是网络编程的核心技术之一,提供了底层的通信机制。在Windows平台上,通常使用Winsock库来实现网络编程。本Demo基于TCP/IP和UDP/IP协议,展示了如何在Visual Studio 2013环境下创建简单的Socket程序。
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它确保了数据包的正确顺序和完整性。而UDP(用户数据报协议)是无连接的协议,它允许数据包在网络中传输,但不保证数据包的顺序和完整性。这两种协议在网络应用中扮演着不同的角色,适用于不同的应用场景。
### TCP协议基础
1. **面向连接**:TCP在数据传输之前需要建立一个连接。这个连接是一个全双工的通道,允许数据在两个方向上同时传输。
2. **可靠性**:TCP通过序列号、确认应答、重传机制、流量控制和拥塞控制等来保证数据的可靠传输。
3. **面向字节流**:TCP将数据看作是无结构的字节流,这意味着TCP负责数据的边界问题,应用程序不需要关注数据包的分界。
### UDP协议基础
1. **无连接**:UDP在传输数据之前不需要建立连接,直接发送数据包。
2. **不可靠性**:UDP不保证数据包的顺序、完整性或可靠性。它不提供重传机制、流量控制或拥塞控制。
3. **低延迟**:由于没有建立连接和维护连接的开销,UDP通常具有较低的延迟,适用于对实时性要求高的应用,如视频会议、在线游戏等。
### 在Windows下的Socket编程
1. **初始化Winsock**:在使用Winsock之前,必须先初始化。在MFC(Microsoft Foundation Classes)中,通常在程序的初始化函数中调用`WSAStartup`来完成初始化。
2. **创建Socket**:通过调用`socket`函数创建Socket对象,它返回一个Socket句柄,该句柄可以用来设置Socket属性、绑定地址、监听连接等。
3. **绑定地址**:使用`bind`函数将Socket绑定到一个特定的IP地址和端口上,这一步是必须的,特别是对于TCP服务器来说。
4. **监听连接**:TCP服务器使用`listen`函数来监听端口上的连接请求。
5. **接受连接**:通过`accept`函数,TCP服务器接受客户端的连接请求,这会返回一个新的Socket,专门用于与该客户端的通信。
6. **数据传输**:使用`send`和`recv`函数进行数据的发送和接收。
7. **关闭Socket**:完成通信后,应调用`closesocket`来关闭Socket。
### 基于TCP的Socket Demo示例
在Visual Studio 2013中,我们可以创建一个基于MFC的控制台应用程序来实现TCP服务器和客户端。服务器端将监听指定端口的连接请求,客户端尝试连接到服务器并发送消息,服务器接收消息并回复确认。
#### TCP服务器端示例代码框架:
```cpp
int main()
{
// 初始化Winsock
WSADATA wsaData;
WORD ver = MAKEWORD(2, 2);
WSAStartup(ver, &wsaData);
// 创建Socket
SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 绑定地址和端口
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = INADDR_ANY;
service.sin_port = htons(5000); // 端口号
bind(ListenSocket, (SOCKADDR*)&service, sizeof(service));
// 监听连接
listen(ListenSocket, SOMAXCONN);
// 接受连接
sockaddr_in client;
int c = sizeof(client);
SOCKET ClientSocket = accept(ListenSocket, (SOCKADDR*)&client, &c);
// 接收和发送数据
char recvbuf[512];
int iResult = recv(ClientSocket, recvbuf, 512, 0);
// 处理接收到的数据
// 发送数据
send(ClientSocket, recvbuf, iResult, 0);
// 关闭Socket
closesocket(ClientSocket);
closesocket(ListenSocket);
WSACleanup();
return 0;
}
```
#### TCP客户端示例代码框架:
```cpp
int main()
{
// 初始化Winsock
WSADATA wsaData;
WORD ver = MAKEWORD(2, 2);
WSAStartup(ver, &wsaData);
// 创建Socket
SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 连接到服务器
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(5000); // 服务器端口号
connect(ConnectSocket, (SOCKADDR*)&server, sizeof(server));
// 发送和接收数据
char sendbuf[] = "Client: Hello, Server!";
send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);
char recvbuf[512];
int iResult = recv(ConnectSocket, recvbuf, 512, 0);
// 关闭Socket
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
```
### 基于UDP的Socket Demo示例
在UDP通信中,服务器和客户端之间不需要建立连接,数据以数据包的形式发送和接收。以下是一个UDP服务器和客户端的基本示例代码框架。
#### UDP服务器端示例代码框架:
```cpp
int main()
{
// 初始化Winsock
WSADATA wsaData;
WORD ver = MAKEWORD(2, 2);
WSAStartup(ver, &wsaData);
// 创建Socket
SOCKET UdpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// 绑定地址和端口
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(5000); // 服务器端口号
server.sin_addr.s_addr = INADDR_ANY;
bind(UdpSocket, (SOCKADDR*)&server, sizeof(server));
// 接收和发送数据
char recvbuf[512];
sockaddr_in client;
int c = sizeof(client);
int iResult = recvfrom(UdpSocket, recvbuf, 512, 0, (SOCKADDR*)&client, &c);
// 处理接收到的数据
// 发送数据
sendto(UdpSocket, recvbuf, iResult, 0, (SOCKADDR*)&client, c);
// 关闭Socket
closesocket(UdpSocket);
WSACleanup();
return 0;
}
```
#### UDP客户端示例代码框架:
```cpp
int main()
{
// 初始化Winsock
WSADATA wsaData;
WORD ver = MAKEWORD(2, 2);
WSAStartup(ver, &wsaData);
// 创建Socket
SOCKET UdpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// 设置目标地址
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(5000); // 目标端口号
server.sin_addr.s_addr = inet_addr("127.0.0.1");
// 发送和接收数据
char sendbuf[] = "Client: Hello, Server!";
sendto(UdpSocket, sendbuf, (int)strlen(sendbuf), 0, (SOCKADDR*)&server, sizeof(server));
char recvbuf[512];
int iResult = recvfrom(UdpSocket, recvbuf, 512, 0, NULL, NULL);
// 关闭Socket
closesocket(UdpSocket);
WSACleanup();
return 0;
}
```
这个Demo使用VS2013编译器编译,它展示了如何使用C++语言和Winsock库创建简单的TCP和UDP网络通信程序。这些示例代码为网络应用开发提供了基础模板,可以根据实际需求进行修改和扩展。了解和掌握这些基础知识点对于进行更复杂的网络通信应用开发至关重要。
相关推荐









土豪gold
- 粉丝: 1320
最新资源
- 达内Hibernate课程资料完整版
- K3 BOS产品操作培训:单据与报表制作详解
- 定制验证码生成器validate-code-tool 0.0.2发布
- C# 发邮件程序源码及常见问题解答
- AJAX技术实现的留言板程序源码解析
- Sybase API的流式数据导入导出技术解析
- Delphi教材管理系统源代码功能解析
- ASP.NET动态网站开发实训教程精讲
- JXL.jar:JAVA操作Excel的最强工具包解析
- 唐网商城自助建站购物系统——免费开源版
- C#开发的汽车销售ERP进销存管理系统
- C++编写公司管理系统代码示例
- 深入理解Boost Thread扩展库:线程安全与通信处理
- nMaker 4.0:高效创建多功能合一光盘工具
- .NET验证码图片生成器及其WEB演示使用
- 注释版串口调试助手源程序及虚拟串口应用指南
- 第二版学生管理系统C++代码解析
- 深入解析nasm-0.98.39汇编器源代码
- 基于Struts和MySQL的网上购物系统源码解析
- Spring框架技术深度解析与应用实例
- 深入解析GridView的多功能特性
- 微软官方LINQ实例精粹,完整101示例教程
- 掌握mapX中文手册,助力mapX开发与应用
- 蓝山公司人事管理系统数据库快速导入指南