C++语言开发文件传输服务,使用C#的客户端上传文件,均采用socket。
服务端在windowXp上可以测试可以使用
// ConsoleNC2.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "MyMd5.h"
//main.cpp
/*************************************************************************
> 服务器测试代码
> 先从客户端接收一个字符串,作为文件的文件名,接着接收客户端发送过来的文
> 件并保存至本地
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#define PORT 8087
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
#pragma comment(lib, "WS2_32")
int main()
{
// 声明并初始化一个服务端(本地)的地址结构
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// 初始化socket dll
WSADATA wsaData;
WORD socketVersion = MAKEWORD(2, 0);
if (WSAStartup(socketVersion, &wsaData) != 0)
{
printf("Init socket dll error!");
exit(1);
}
// 创建socket
SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, 0);
if (SOCKET_ERROR == m_Socket)
{
printf("Create Socket Error!");
exit(1);
}
//绑定socket和服务端(本地)地址
if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
{
printf("Server Bind Failed: %d", WSAGetLastError());
exit(1);
}
//监听
if (SOCKET_ERROR == listen(m_Socket, 10))
{
printf("Server Listen Failed: %d", WSAGetLastError());
exit(1);
}
while (true)
{
printf("wait for file transfer...\n");
char file_name[BUFFER_SIZE];
char buffer[BUFFER_SIZE];
sockaddr_in client_addr;
int client_addr_len = sizeof(client_addr);
//首先接收发送过来的字符串
SOCKET m_New_Socket = accept(m_Socket, (sockaddr *)&client_addr, &client_addr_len);
if (SOCKET_ERROR == m_New_Socket)
{
printf("Server Accept Failed: %d", WSAGetLastError());
break;
}
memset(buffer, 0, sizeof(buffer));
memset(file_name, 0, sizeof(file_name));
if (recv(m_New_Socket, buffer, sizeof(buffer), 0)<0)
{
printf("recv file name fail!\n");
continue;
}
strncpy(file_name, buffer, strlen(buffer));
printf("recv file name : %s \n", file_name);
FILE * fp = fopen(file_name, "wb");
if (fp == NULL)
{
printf("open file error\n");
continue;
}
//获取字符串后继续获取文件数据
memset(buffer, 0, BUFFER_SIZE);
int length = 0;
while ((length = recv(m_New_Socket, buffer, BUFFER_SIZE, 0)) > 0)
{
if (fwrite(buffer, sizeof(char), length, fp) < length)
{
printf("File: %s Write Failed\n", file_name);
break;
}
memset(buffer, 0, BUFFER_SIZE);
}
fclose(fp);
printf("file transfer success!\n");
//32位的
char *md5= MD5_file(file_name, 32);
printf("32: %s\n", md5);
free(md5);
char path[100] = { "OK" };
memset(buffer, 0, 1024);
strncpy(buffer, path, strlen(path)>1024 ? 1024 : strlen(path));// path放入buffer
send(m_New_Socket, buffer, 1024, 0);
}
system("pause");
return 0;
}
c# client
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleAF
{
class Program
{
static Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(string[] args)
{
sock.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8087));
Console.WriteLine("Connect successfully");
Console.WriteLine("please input the path of the file which you want to send:");
string path = Console.ReadLine();
GetMD5(path);
try
{
using (FileStream reader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
{
long send = 0L, length = reader.Length;
string sendStr = "namelength," + Path.GetFileName(path) + "," + length.ToString();
string fileName = Path.GetFileName(path);
sock.Send(Encoding.Default.GetBytes(fileName));
int BufferSize = 1024;
//[] buffer = new byte[32];
//sock.Receive(buffer);
//string mes = Encoding.Default.GetString(buffer);
Console.WriteLine("Sending file:" + fileName + ".Plz wait...");
byte[] fileBuffer = new byte[BufferSize];
int read, sent;
while ((read = reader.Read(fileBuffer, 0, BufferSize)) != 0)
{
sent = 0;
while ((sent += sock.Send(fileBuffer, sent, read, SocketFlags.None)) < read)
{
send += (long)sent;
}
}
reader.Close();
Console.WriteLine("Send finish.\n");
}
// byte[] buffer = new byte[32];
// sock.Receive(buffer);
// string mes = Encoding.Default.GetString(buffer);
//Console.WriteLine(mes);
sock.Close();
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void GetMD5(string s)
{
try
{
FileStream file = new FileStream(s, FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retval = md5.ComputeHash(file);
file.Close();
StringBuilder sc = new StringBuilder();
for (int i = 0; i < retval.Length; i++)
{
sc.Append(retval[i].ToString("x2"));
}
Console.WriteLine("文件MD5:{0}", sc);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void GetSHA1(string s)
{
try
{
FileStream file = new FileStream(s, FileMode.Open);
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] retval = sha1.ComputeHash(file);
file.Close();
StringBuilder sc = new StringBuilder();
for (int i = 0; i < retval.Length; i++)
{
sc.Append(retval[i].ToString("x2"));
}
Console.WriteLine("文件SHA1:{0}", sc);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}