十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
我不给你代码了,我才编了SOCKET的,告诉你原理吧(我的编程经验而已)
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、成都网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的承德县网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
SOCKET传输文件和接受是有大小限制的,默认是81**来则也就是8K多,你可以改小,但改大我没试过,然后你必须把文件分成若干份,然后传过去,然后在接收端组合起来,同时接收端的接受大小要和发送大小统一。
至于你说的文件名,文件名不属于文件数据中的一部分,它不参与数据传输的,你只能在接收端重新改名字。
同时为什么要用上面的方法传呢,因为VB.NET中的SOCKET有很多问题,我就为此烦过,因为要丢包(理论上TCP不存在),或者粘包,或者断包,也就是你在接收端获取文件时数据是要出错的,比如你定长3000B,结果接收端可能先收到2000B,当接受端接受后,处理会出错的。
所以SOCKET的标准发送方法是建立定长的结构体(结构体必须定义为可序列化结构体),最好结构体里面至少包含有 1,文件名,2,本包序号,3,本包数据,比如每个包大小3040B,文件名占20,序号占20,数据占3000,然后发送出去,接收端每次固定接受3040B,如果接受到的包没有这么大(比如收到2000),那么继续接受(1040),直到达到3040后组合成一个包,在把包分解成结构体,相同的文件名为一个文件,再按照序号按次组合其中的数据,这就完成了传输。这样的方法还可以同时传送多个文件,因为结构体里面包含了文件名和序列号,不会错乱,如果是大文件,请不要接收完毕后(最后一个包的序号可以为-1,或者包里包含总长度,检查到序号为-1时表示完毕,或者达到总长度后表示完毕)再组合,因为这样会浪费电脑内存,最好的方法是一边接受数据,一边写入到文件中(收到第一个包时就建立文件,以后每个包的数据都往里面写)。
回答你的问题:
1、经过上面的传输后,文件是不变化的,MD5检查都是正常的,不用担心文件大小有变化(如果有变化,那就是代码没编对)
2,、文件名问题,我前面提到了,文件名是不参与传输的,它不属于数据中的一部分,比如同一个文件,不管你怎么改名字MD5是不变的。你只能通过把文件名想办法传给对方(比如我上面说的结构体方法),让对方写入文件时使用。
3,代码:
还是给你找找吧,等等
不行,我的都很大,很长,你还是在网上找吧,有很多例子,我也是网上学的。
在vb.net里面,可以这样算文件的MD5值,你用工具转换过来就有C#的代码了。
Private Function GetFileMD5(fileName As String) As String
Dim hashValue As Byte()
Dim sb As New StringBuilder()
Try
Dim fileStream As New FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, True)
Using md5 = New System.Security.Cryptography.MD5CryptoServiceProvider()
hashValue= md5.ComputeHash(fileStream)
End Using
Dim i As Integer = 0
sb.Capacity = hashValue.Length * 2
While i hashValue.Length
sb.Append(hashValue(i).ToString("x2"))
i += 1
End While
Catch ex As Exception
Throw
End Try
Return sb.ToString()
End Function
运行结果
小文件
系统自带工具运行结果
大文件
以上代码小文件(十几K)、大文件(几G)都测试过
解密的没有...
加密的自己做一个吧
3.119 icePub_getMD5
l 函数原型:
int WINAPI icePub_getMD5(char* pBuf, int buffLen,char *strResult)
输入:pBuf 待处理的数据
nLength 待处理数据的长度
输出:strResult MD5结果串,32字节
返回码:
l VC连接Lib方式声明
__declspec(dllexport)
int WINAPI icePub_getMD5(char* pBuf, int buffLen,char *strResult);
l 动态调用例程
VC sample代码:
char buff[1024];
char buff2[1024];
strcpy(buff2,"Walk At Familiar Alley, Pursue Concordand's Footfall, Between Front And Back, What Course To Follow?");
typedef int (WINAPI ICEPUB_GETMD5)( char* pBuf, int buffLen,char *strResult);
ICEPUB_GETMD5 *icePub_getMD5 = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_getMD5=(ICEPUB_GETMD5 *)GetProcAddress(hDLLDrv,"icePub_getMD5");
}
if(icePub_getMD5)
icePub_getMD5(buff2,strlen(buff2),buff);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
AfxMessageBox(buff);
VB sample 代码:
Private Declare Function icePub_getMD5 Lib "icePubDll.dll" (ByVal pBuf As String, ByVal buffLen As Integer, ByVal strResult As String) As Integer
Dim a2 As Integer
Dim buff As String
Dim buff2 As String
buff2="Go with This life Loneliness, carried off Day And Night Dreariness, Between Sun And Moon, Tell Words from one's heart Each Other."
buff=Space(1024)
a2=icePub_getMD5(buff2,LenB(buff2),buff)
MsgBox buff
3.121 icePub_getMD5FromFile
l 函数原型:
int WINAPI icePub_getMD5FromFile(char *strFilePath,char *strResult)
输入:strFilePath 待MD5的文件名
输出:strResult MD5结果串,32字节
返回码:
l VC连接Lib方式声明
__declspec(dllexport)
int WINAPI icePub_getMD5FromFile(char *strFilePath,char *strResult);
l 动态调用例程
VC sample代码:
char buff[1024];
typedef int (WINAPI ICEPUB_GETMD5FROMFILE)(char *strFilePath,char *strResult);
ICEPUB_DESDECRYPTIONSTRING *icePub_getMD5FromFile = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_getMD5FromFile=(ICEPUB_DESDECRYPTIONSTRING *)GetProcAddress(hDLLDrv,"icePub_getMD5FromFile");
}
if(icePub_getMD5FromFile)
icePub_getMD5FromFile("D:\\icePubDLL.dll",buff);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
AfxMessageBox(buff);
VB sample 代码:
Private Declare Function icePub_getMD5FromFile Lib "icePubDll.dll" (ByVal strFilePath As String, ByVal strResult As String) As Integer
Dim a2 As Integer
Dim buff As String
buff=Space(1024)
a2=icePub_getMD5FromFile("D:\icePubDLL.dll",buff)
MsgBox buff
3.120 icePub_getMD5FromString
l 函数原型:
int WINAPI icePub_getMD5FromString(char *strData,char *strResult)
输入:strData 待处理的文本串
输出:strResult MD5结果串,32字节
返回码:
l VC连接Lib方式声明
__declspec(dllexport)
int WINAPI icePub_getMD5FromString(char *strData,char *strResult);
l 动态调用例程
VC sample代码:
char buff[1024];
char buff2[1024];
strcpy(buff2,"Walk At Familiar Alley, Pursue Concordand's Footfall, Between Front And Back, What Course To Follow?");
typedef int (WINAPI ICEPUB_GETMD5FROMSTRING)(char *strData,char *strResult);
ICEPUB_GETMD5FROMSTRING *icePub_getMD5FromString = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_getMD5FromString=(ICEPUB_GETMD5FROMSTRING *)GetProcAddress(hDLLDrv,"icePub_getMD5FromString");
}
if(icePub_getMD5FromString)
icePub_getMD5FromString(buff2,buff);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
AfxMessageBox(buff);
VB sample 代码:
Private Declare Function icePub_getMD5FromString Lib "icePubDll.dll" (ByVal strData As String, ByVal strResult As String) As Integer
Dim a2 As Integer
Dim buff As String
Dim buff2 As String
buff2="Go with This life Loneliness, carried off Day And Night Dreariness, Between Sun And Moon, Tell Words from one's heart Each Other."
buff=Space(1024)
a2=icePub_getMD5FromString(buff2,buff)
MsgBox buff
下载
是否可以解决您的问题?
Public Function md5(ByVal a As String) As String
Dim tempmd5 As System.Security.Cryptography.MD5 = New System.Security.Cryptography.MD5CryptoServiceProvider()
Dim bytResult() As Byte = tempmd5.ComputeHash(System.Text.Encoding.Default.GetBytes(a))
Dim strResult As String = BitConverter.ToString(bytResult)
strResult = strResult.Replace("-", "")
Return strResult
End Function
如果要计算文件的就把参数改成字节数组就可以了,然后获取文件GetBytes()传进去就可以了。