从来没弄过Socket的一些东西,最近看了看,一些小东西,希望能帮到和我一样的菜鸟。
1、win32程序下的文件传输
1.1、Client Code
#include
#include
long GetFileLen(FILE *_file)
{
long curPosit=ftell(_file),fileLen;
fseek(_file,0,SEEK_END);
fileLen=ftell(_file);
fseek(_file,curPosit,SEEK_SET);
return fileLen;
}
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
return;
}
if(LOBYTE( wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.28");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
FILE *writeFile=fopen("F:\\b.doc","wb");
char recvBuf[100];
int rc;
while((rc=recv(sockClient,recvBuf,100,0))>0)
{
fwrite(recvBuf,sizeof(char),rc,writeFile);
}
closesocket(sockClient);
WSACleanup();
}
1.2、Server Code
#include
#include
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
return;
}
if(LOBYTE( wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return;
}
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
FILE *readFile;
readFile=fopen("E:\\a.doc","rb");
char recvBuf[100];
int rc;
long fileLen=GetFileLen(readFile);
while((rc=fread(recvBuf,sizeof(char),100,readFile))!=0)
{
send(sockConn,recvBuf,(sizeof(char)*rc),0);
printf("%d%%\n",(short)((((double)ftell(readFile))*100)/(double)fileLen));
}
closesocket(sockConn);
closesocket(sockSrv);
WSACleanup();
}
2、MFC项目文件传输
文件结构:
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;
2.1、服务器程序
CFile myFile;
if(!myFile.Open("文件路径以及文件名", CFile::modeRead | CFile::typeBinary))
{
AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);
return;
}
CSocket sockSrvr;
sockSrvr.Create(800);
sockSrvr.Listen();
CSocket sockRecv;
sockSrvr.Accept(sockRecv);
SOCKET_STREAM_FILE_INFO StreamFileInfo;
WIN32_FIND_DATA FindFileData;
FindClose(FindFirstFile(Dlg.GetPathName(),&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
2.2、客户端程序
AfxSocketInit(NULL);
CSocket sockClient;
sockClient.Create();
CString szIP = "服务器IP地址,本机就直接127.0.0.1";
if(!sockClient.Connect((LPCTSTR)szIP, 800))
{
AfxMessageBox("连接到对方机器失败!");
return;
}
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