// 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。接受数据拆包,因为你知道每个包的顺序位,所有按顺序组织文件/大数据
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)