浪潮君 的學(xué)生作業(yè):
服務(wù)端
#include // 標(biāo)準(zhǔn)輸入輸出
#include // malloc、exit 等
#include // memset、strlen
#include // close、read、write 等系統(tǒng)調(diào)用
#include // IP 地址轉(zhuǎn)換函數(shù)
#include // 套接字編程相關(guān)結(jié)構(gòu)和函數(shù)
#define SERVER_PORT 8890 // 服務(wù)器監(jiān)聽端口號(hào)
#define BACKLOG 5 // 最大連接等待隊(duì)列長(zhǎng)度
#define BUFFER_SIZE 1024 // 文件傳輸緩沖區(qū)大小
// 處理客戶端發(fā)送的文件并將其保存到本地磁盤
void receive_file(int conn_fd) {
int name_len; // 用于接收文件名的長(zhǎng)度
char filename[256]; // 保存接收到的文件名
long filesize; // 文件大?。▎挝唬鹤止?jié))
// 1. 接收文件名長(zhǎng)度(int 類型,4 字節(jié))
recv(conn_fd, &name_len, sizeof(int), 0);
// 2. 接收文件名(不含路徑)
recv(conn_fd, filename, name_len, 0);
filename[name_len] = '\0'; // 添加字符串結(jié)束符
printf("接收文件名:%s\n", filename);
// 3. 接收文件大?。╨ong 類型,8 字節(jié))
recv(conn_fd, &filesize, sizeof(long), 0);
printf("文件大?。?ld 字節(jié)\n", filesize);
// 4. 打開目標(biāo)文件,準(zhǔn)備寫入內(nèi)容
FILE *fp = fopen(filename, "wb");
if (!fp) {
perror("無法創(chuàng)建文件");
return;
}
// 5. 接收文件內(nèi)容并寫入文件
char buffer[BUFFER_SIZE];
long received = 0;
while (received < filesize) {
ssize_t len = recv(conn_fd, buffer, sizeof(buffer), 0);
if (len 0) {
send(sockfd, buffer, read_bytes, 0); // 每次發(fā)送一段
}
fclose(fp); // 關(guān)閉文件
printf("文件發(fā)送完成。\n");
}
int main() {
// 創(chuàng)建客戶端 socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket 創(chuàng)建失敗");
return 1;
}
// 設(shè)置服務(wù)器地址結(jié)構(gòu)體
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr)); // 清空結(jié)構(gòu)體
server_addr.sin_family = AF_INET; // IPv4
server_addr.sin_port = htons(SERVER_PORT); // 設(shè)置端口
// 轉(zhuǎn)換 IP 地址為網(wǎng)絡(luò)格式
if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr)