VC SOCKET 文件传输程序问题

VC SOCKET 文件传输程序问题,第1张

用VC6.0建立两个WIndows32 Console Application程序,并且选择一个支持MFC的程序,第一个程序中输入:

// server.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "server.h"

#include<afxsock.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__

#endif

/////////////////////////////////////////////////////////////////////////////

// The one and only application object

CWinApp theApp

using namespace std

typedef struct _SOCKET_STREAM_FILE_INFO {

TCHAR szFileTitle[128]//文件的标题名

DWORD dwFileAttributes//文件的属性

FILETIME ftCreationTime//文件的创建时间

FILETIME ftLastAccessTime//文件的最后访问时间

FILETIME ftLastWriteTime//文件的最后修改时间

DWORD nFileSizeHigh//文件大小的高位双字

DWORD nFileSizeLow//文件大小的低位双字

DWORD dwReserved0//保留,为0

DWORD dwReserved1//保留,为0

} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

int nRetCode = 0

// initialize MFC and print and error on failure

if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))

{

// TODO: change error code to suit your needs

cerr <<_T("Fatal Error: MFC initialization failed") <<endl

nRetCode = 1

}

else

{

// TODO: code your application's behavior here.

CString strHello

strHello.LoadString(IDS_HELLO)

cout <<(LPCTSTR)strHello <<endl

}

CSocket sockClient

sockClient.Create()

if(!sockClient.Connect("127.0.0.1", 800))

{

AfxMessageBox("连接到对方机器失败!")

return 0

}

SOCKET_STREAM_FILE_INFO StreamFileInfo

sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO))

CFile destFile(StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)

UINT dwRead = 0

while(dwRead)

{

byte* data = new byte[1024]

memset(data,0,1024)

UINT dw=sockClient.Receive(data, 1024)

destFile.Write(data, dw)

dwRead+=dw

}

SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,

&StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime)

destFile.Close()

SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes)

sockClient.Close()

AfxMessageBox("接收完毕!")

return nRetCode

}

另外一个程序输入:

// client.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "client.h"

#include <afxsock.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__

#endif

/////////////////////////////////////////////////////////////////////////////

// The one and only application object

CWinApp theApp

using namespace std

typedef struct _SOCKET_STREAM_FILE_INFO {

TCHAR szFileTitle[128]//文件的标题名

DWORD dwFileAttributes//文件的属性

FILETIME ftCreationTime//文件的创建时间

FILETIME ftLastAccessTime//文件的最后访问时间

FILETIME ftLastWriteTime//文件的最后修改时间

DWORD nFileSizeHigh//文件大小的高位双字

DWORD nFileSizeLow//文件大小的低位双字

DWORD dwReserved0//保留,为0

DWORD dwReserved1//保留,为0

} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

int nRetCode = 0

// initialize MFC and print and error on failure

if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))

{

// TODO: change error code to suit your needs

cerr <<_T("Fatal Error: MFC initialization failed") <<endl

nRetCode = 1

}

else

{

// TODO: code your application's behavior here.

CString strHello

strHello.LoadString(IDS_HELLO)

cout <<(LPCTSTR)strHello <<endl

}

CFile myFile

CString filename="123.txt"

if(!myFile.Open(filename, CFile::modeRead | CFile::typeBinary))

{

AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR)

return 0

}

CSocket sockSrvr

sockSrvr.Create(800)

sockSrvr.Listen()

CSocket sockRecv

sockSrvr.Accept(sockRecv)

SOCKET_STREAM_FILE_INFO StreamFileInfo

WIN32_FIND_DATA FindFileData

FindClose(FindFirstFile(filename,&FindFileData))

memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO))

strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle())

StreamFileInfo.dwFileAttributes = FindFileData.dwFileAttributes

StreamFileInfo.ftCreationTime = FindFileData.ftCreationTime

StreamFileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime

StreamFileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime

StreamFileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh

StreamFileInfo.nFileSizeLow = FindFileData.nFileSizeLow

sockRecv.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO))

UINT dwRead=0

while(dwRead)

{

byte* data = new byte[1024]

UINT dw=myFile.Read(data, 1024)

sockRecv.Send(data, dw)

dwRead+=dw

}

myFile.Close()

sockRecv.Close()

AfxMessageBox("发送完毕!")

return nRetCode

}

现在应该可以运行了,然后根据你的需要修改

你可以参考文件传输。

网络传输无非就是数据打包传输,接受方解包,然后消费数据。

给你提供一个架构思路:

发送方:

1。文件/大数据拆解,比如一包1k。每个数据包有自己的ID,顺序位,checksum。

2。将所有数据包发送出去,不用考虑先后顺序。

3。发送失败的重发,或者其他处理

接受方:

1。接受数据拆包,因为你知道每个包的顺序位,所有按顺序组织文件/大数据


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12093441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存