在dev c++下用winsock2 代码实现以下内容 创建收发文件的服务器/客服端,实现如下功能:客户端接受用户输入的传输文件名。客户端请求服务器端在指定文件夹下传输该文件名所指的文件。 如果指定文件存在,服务器端就将其发送给客户端;反之,则断开连接。
时间: 2024-03-01 13:54:21 浏览: 63
好的,以下是基于Winsock2实现的服务器/客户端收发文件的代码,可以供您参考:
服务器端代码:
```c++
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 加载 ws2_32.dll
#define PORT 8080 // 服务器端口号
#define BUF_SIZE 1024 // 缓冲区大小
int main() {
// 初始化 Winsock2
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed.\n");
return 1;
}
// 创建套接字
SOCKET listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSock == INVALID_SOCKET) {
printf("socket failed.\n");
WSACleanup();
return 1;
}
// 绑定端口号
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(PORT);
if (bind(listenSock, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("bind failed.\n");
closesocket(listenSock);
WSACleanup();
return 1;
}
// 监听连接
if (listen(listenSock, SOMAXCONN) == SOCKET_ERROR) {
printf("listen failed.\n");
closesocket(listenSock);
WSACleanup();
return 1;
}
printf("Server started.\n");
// 接受连接
SOCKET clientSock = accept(listenSock, NULL, NULL);
if (clientSock == INVALID_SOCKET) {
printf("accept failed.\n");
closesocket(listenSock);
WSACleanup();
return 1;
}
printf("Client connected.\n");
// 接收文件名
char fileName[BUF_SIZE];
int ret = recv(clientSock, fileName, BUF_SIZE, 0);
if (ret == SOCKET_ERROR) {
printf("recv failed.\n");
closesocket(clientSock);
closesocket(listenSock);
WSACleanup();
return 1;
}
fileName[ret] = '\0'; // 将接收到的数据转换为字符串
printf("File name: %s\n", fileName);
// 打开文件
FILE* file = fopen(fileName, "rb");
if (file == NULL) {
printf("File not found.\n");
closesocket(clientSock);
closesocket(listenSock);
WSACleanup();
return 1;
}
// 发送文件内容
char buffer[BUF_SIZE];
while (true) {
ret = fread(buffer, 1, BUF_SIZE, file);
if (ret == 0) break; // 文件读取完毕
send(clientSock, buffer, ret, 0);
}
printf("File sent.\n");
// 关闭连接和文件
fclose(file);
closesocket(clientSock);
closesocket(listenSock);
WSACleanup();
return 0;
}
```
客户端代码:
```c++
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 加载 ws2_32.dll
#define SERVER_IP "127.0.0.1" // 服务器 IP 地址
#define PORT 8080 // 服务器端口号
#define BUF_SIZE 1024 // 缓冲区大小
int main() {
// 初始化 Winsock2
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed.\n");
return 1;
}
// 创建套接字
SOCKET clientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSock == INVALID_SOCKET) {
printf("socket failed.\n");
WSACleanup();
return 1;
}
// 连接服务器
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
serverAddr.sin_port = htons(PORT);
if (connect(clientSock, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("connect failed.\n");
closesocket(clientSock);
WSACleanup();
return 1;
}
printf("Connected to server.\n");
// 输入文件名
char fileName[BUF_SIZE];
printf("Enter file name: ");
scanf("%s", fileName);
// 发送文件名
int ret = send(clientSock, fileName, strlen(fileName), 0);
if (ret == SOCKET_ERROR) {
printf("send failed.\n");
closesocket(clientSock);
WSACleanup();
return 1;
}
// 接收文件内容
char buffer[BUF_SIZE];
FILE* file = fopen(fileName, "wb");
while (true) {
ret = recv(clientSock, buffer, BUF_SIZE, 0);
if (ret == SOCKET_ERROR) {
printf("recv failed.\n");
closesocket(clientSock);
fclose(file);
WSACleanup();
return 1;
} else if (ret == 0) {
break; // 连接关闭
}
fwrite(buffer, 1, ret, file);
}
printf("File received.\n");
// 关闭连接和文件
fclose(file);
closesocket(clientSock);
WSACleanup();
return 0;
}
```
注意事项:
1. 服务器端需要将文件放在指定文件夹下;
2. 文件名不要包含中文或其他特殊字符;
3. 以上代码仅供参考,实际使用中需要根据情况做出适当修改。
阅读全文