使用socket传送文件
简言
客户端向服务端发送消息,获取文件.服务端找到文件给客户端发送.客户端 client.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 8089 //指定端口
#define BUF_SIZE 1024 //传输问大小
#define FILE_NAME_SIZE 128 //传输文件名称长度
#define SERVER_IP "192.168.31.206"
int main(int argc, char *argv[])
{
WSADATA wsadata;
WORD socket_verson = MAKEWORD(2, 2); //定义版本
if (WSAStartup(socket_verson, &wsadata) != 0)
{
fprintf(stderr, "socket init failed!\n");
abort();
}
//create socket
SOCKET client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == SOCKET_ERROR)
{
fprintf(stderr, "socket create failed!\n");
abort();
}
SOCKADDR_IN server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(PORT);
//连接
if (connect(client_socket, (SOCKADDR *)&server_addr, sizeof(server_addr)) == SOCKET_ERROR)
{
fprintf(stderr, "socket connection failed!\n");
abort();
}
//获取输入文件名
char file_name[FILE_NAME_SIZE] = { 0 };
sprintf(stdout, "get file:");
scanf("%s", file_name);
char buffer[BUF_SIZE];
memset(buffer, 0, BUF_SIZE);
strcpy(buffer, file_name);
//发送消息
if (send(client_socket, buffer, BUF_SIZE, 0) < 0)
{
fprintf(stderr, "socket send failed!\n");
abort();
}
FILE *pf = fopen(file_name, "wb");
if (pf == NULL)
{
fprintf(stderr, "open file failed!\n");
abort();
}
else
{
memset(buffer, 0, BUF_SIZE);
int len = 0;
fprintf(stdout, "file start recv %s :\n", file_name);
//开始接收文件
while (len = recv(client_socket, buffer, BUF_SIZE, 0) > 0)
{
if (fwrite(buffer, sizeof(char), BUF_SIZE, pf) < len)
{
fprintf(stderr, "file recv error!\n");
abort();
}
memset(buffer, 0, BUF_SIZE);
}
fprintf(stdout, "file end recv %s :\n", file_name);
}
fclose(pf);
closesocket(client_socket);
WSACleanup();
system("pause");
return 0;
}
服务端 server.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 8089 //指定端口
#define BUF_SIZE 1024 //传输问大小
#define FILE_NAME_SIZE 128 //传输文件名称长度
#define SERVER_IP "192.168.31.206"
//服务端
int main(int argc, char *argv[])
{
WSADATA wsadata;
WORD socket_verson = MAKEWORD(2, 2); //定义版本
if (WSAStartup(socket_verson, &wsadata) != 0)
{
fprintf(stderr, "socket init failed!\n");
abort();
}
SOCKADDR_IN server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
//1 create
SOCKET server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == SOCKET_ERROR)
{
fprintf(stderr, "socket create failed!\n");
abort();
}
//2 bind
int bind_result = bind(server_socket, (SOCKADDR *)&server_addr, BUF_SIZE);
if (bind_result == SOCKET_ERROR)
{
fprintf(stderr, "socket bind failed!\n");
abort();
}
//3 listen
int listen_result = listen(server_socket, 0);
if (listen_result == SOCKET_ERROR)
{
fprintf(stderr, "socket listen error!\n");
abort();
}
//recv
fprintf(stderr, "start listen !\n");
while (1)
{
//
SOCKADDR_IN client_addr;
int client_len = sizeof(client_addr);
SOCKET recv_socket = accept(server_socket, (SOCKADDR *)&client_addr, &client_len);
if (recv_socket == SOCKET_ERROR)
{
fprintf(stderr, "socket connect error!\n");
break;
}
char file_name[FILE_NAME_SIZE] = { 0 };
char buffer[BUF_SIZE] = { 0 };
int recv_result = recv(recv_socket, buffer, BUF_SIZE, 0);
if (recv_result < 0)
{
fprintf(stderr, "socket recv error!\n");
break;
}
strcpy(file_name, buffer);
memset(buffer, 0, BUF_SIZE);
FILE *pf = fopen(file_name, "rb");
if (pf == NULL)
{
fprintf(stderr, "file open failed!\n");
break;
}
else
{
int recv_len = 0;
int recv_result = 0;
//read file
while ((recv_result = fread(buffer, sizeof(char), BUF_SIZE, pf)) > 0)
{
//send file
int send_result = send(recv_socket, buffer, BUF_SIZE, 0);
if (send_result < 0)
{
fprintf(stderr, "file send failed!\n");
break;
}
memset(buffer, 0, BUF_SIZE);
}
fclose(pf);
closesocket(recv_socket);
}
}
closesocket(server_socket);
WSACleanup();
printf("close sokcet!\n");
system("pause");
return 0;
}
秋风
2016-08-21