使用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