将上面UDP服务器程序修改为TCP服务器程序
时间: 2024-09-07 21:04:08 浏览: 39
C#各种类型TCP&UDP服务器代码
要将上面的UDP服务器程序修改为TCP服务器程序,主要是更改网络套接字类型、连接处理方式以及一些API调用。以下是修改后的部分关键代码:
1. **修改套接字类型**:将`SOCK_DGRAM`改为`SOCK_STREAM`,因为TCP是基于连接的,而UDP是无连接的。所以替换为如下:
```c
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
```
2. **取消使用UDP特定功能**:由于TCP不需要`bind()`到特定的地址,可以删除这行:
```c
// 删除这一行,因为在TCP中服务器通常监听而非绑定特定地址
// addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
```
3. **处理连接请求**:对于TCP服务器,需要使用`accept()`等待客户端连接,添加相应的代码块:
```c
if (listen(sockSrv, SOMAXCONN) == -1) {
perror("listen error");
WSACleanup();
return;
}
SOCKET sockClient = accept(sockSrv, NULL, NULL);
if (sockClient == INVALID_SOCKET) {
perror("accept error");
closesocket(sockSrv);
WSACleanup();
return;
}
```
4. **调整数据传输**:TCP是全双工的,所以不需要像UDP那样分别处理发送和接收,只需读取和写入即可:
```c
char recvBuf[100];
char sendBuf[100];
...
do {
// 读取客户端数据
ssize_t bytesRead = recv(sockClient, recvBuf, sizeof(recvBuf), 0);
if (bytesRead <= 0) {
break; // 断开连接时处理
}
// 处理接收到的数据...
} while (true); // 变更while条件
// 发送数据给客户端...
```
5. **处理断开连接**:在数据读取过程中,当检测到`recv()`返回值小于0(通常是因为连接已断开)时,跳出循环并清理资源。
现在,这个程序是一个基于TCP的服务器,等待客户端连接,处理双向数据流。
阅读全文