C++文件传输服务 C#的客户端

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);
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值