📄 ftpsocket.c
字号:
/*******************************************************
Copyright (c) 2005 Lenovo Corporation
All rights reserved.
Module Name:
FTPsocket.c
Abstract:
建立提供socket通讯
Author: WangZhe
Revision History
********************************************************/
#include "FTPSocket.h"
#include "kwTools.h"
INT32 nWaitSecond=-1;//等待时间
void FtpSocketTest()
{
Print(L"FTP Socket test ... \n");
}
//从socket里面读取确定数量的字符
INT32 SocketRecvAll(SOCKET_ID SocketId, CHAR8 *pBuffer, int len)
{
INT32 nRemain = len;
INT32 nReceived;
while(nRemain >0)
{
nReceived = SocketRecv( SocketId, pBuffer, nRemain );
if( nReceived < 0 )
{
return SOCKET_ERROR;
}
if( nReceived == 0 )
{
return 0;
}
nRemain -= nReceived;
pBuffer = pBuffer + nReceived;
}
return nRemain;
}
/*
//接收一个消息
INTN RecvMessage(SOCKET_ID SocketId,
CHAR16 *MessageStr,
INT32 *CmdCode,
INT32 *SubCmdCode)
{
SocketPackageHead hd;
INT32 Size,nResult;
CHAR8 *tempChar8Str;//[256];
if(SocketId == INVALID_SOCKET)
{
Print(L"Socket Error!\n\r");
return SOCKET_ERROR;
}
// nReceived = SocketRecv( SocketId, pBuffer, nRemain );
// if( nReceived < 0 )
//// {
// return SOCKET_ERROR;
// }
// if( nReceived == 0 )
// {
// return 0;
// }
//first get package head
nResult = SocketRecvAll(SocketId, (CHAR8*)&hd, sizeof(SocketPackageHead));
if (nResult <0)
{
Print(L"Socket Error, to recv Message Head. \n");
return SOCKET_ERROR;
}
//ready to receive the message data
Size = hd.packageLength - sizeof(hd);
tempChar8Str = MEM_ALLOC(Size);
nResult = SocketRecvAll(SocketId, tempChar8Str, Size);
if (nResult <0)
{
Print(L"Socket Error to recv Message String\n\r");
MEM_FREE(tempChar8Str);
return 0;
}
StringWide8To16(tempChar8Str,MessageStr);
*CmdCode = hd.cmdcode;
*SubCmdCode = hd.subcmdcode;
MEM_FREE(tempChar8Str);
return 1;
}
*/
//接收一个消息
INTN RecvMessage(SOCKET_ID SocketId,
CHAR16 *MessageStr,
INT32 *CmdCode,
INT32 *SubCmdCode)
{
SocketPackageHead hd;
INT32 Size,nResult;
CHAR8 *tempChar8Str;//[256];
if(SocketId == INVALID_SOCKET)
{
Print(L"Socket Error!\n\r");
return SOCKET_ERROR;
}
//first get package head
nResult = SocketRecv(SocketId, (CHAR8*)&hd, sizeof(SocketPackageHead));
if (nResult <0)
{
//Print(L"Socket Error, to recv Message Head. \n");
return SOCKET_ERROR;
}
if( nResult == 0 )
{
//Print(L"NotReady to recv Message Head\n\r");
return 0;
}
//ready to receive the message data
Size = hd.packageLength - sizeof(hd);
tempChar8Str = MEM_ALLOC(Size);
nResult = SocketRecv(SocketId, tempChar8Str, Size);
if (nResult <0)
{
Print(L"Socket Error to recv Message String\n\r");
MEM_FREE(tempChar8Str);
return SOCKET_ERROR;
}
if( nResult == 0 )
{
//Print(L"NotReady to recv Message String\n\r");
MEM_FREE(tempChar8Str);
return 0;
}
if(MessageStr!=NULL)
StringWide8To16(tempChar8Str,MessageStr);
*CmdCode = hd.cmdcode;
*SubCmdCode = hd.subcmdcode;
MEM_FREE(tempChar8Str);
return 1;
}
//发送一个消息
BOOLEAN SendMessage(SOCKET_ID SocketId,
CHAR16 *MessageStr,
INT32 CmdCode,
INT32 SubCmdCode)
{
SocketPackageHead hd;
INT32 len8,nResult;
CHAR8 tempChar8Str[256];
if(SocketId == INVALID_SOCKET)
{
Print(L"Socket Error!\n\r");
return FALSE;
}
//len16 = StrLen(MessageStr)+1;
len8 = String16To8(MessageStr,tempChar8Str)+1;
hd.packageLength = sizeof(SocketPackageHead)+len8;
hd.cmdcode = CmdCode;
hd.subcmdcode = SubCmdCode;
//send the head
nResult = Socket_write(SocketId, &hd, sizeof(SocketPackageHead) );
if (nResult <=0)
{
Print(L"Error to send MessageStr head Command.\n\r");
return FALSE;
}
//send string
//Print(L"String16To8:8-%d 16-%d\n %s\n",len8,len16,MessageStr);
nResult = SocketSend(SocketId, tempChar8Str, len8 );
if (nResult <=0)
{
Print(L"Error to send MessageString.\n\r");
return FALSE;
}
return TRUE;
}
//接收一个文件
INT32 RecvFile(SOCKET_ID SocketId, CHAR16 *FileName)
{
CHAR8 *pBuffer;
INT32 Status;
EFI_FILE_HANDLE FileHandle;
INT32 subcmdcode;
SocketPackageHead hd;
INT32 Size,nResult, FileLen =0, BlockNo=0,Receved;
INT32 totallen;
FileHandle=NULL;
Receved=0;
if(!SendMessage(SocketId,L"hi!!!",123,456))
{
Print(L"Fail!!!!!\n");
return FALSE;
};
//============================================
//首先获得文件传输的头
nResult = SocketRecvAll(SocketId, (CHAR8*)&hd, sizeof(SocketPackageHead));
subcmdcode = hd.subcmdcode;
if (nResult <0 )
{
Print(L"Socket Error, can't get File Open headn\n");
Status = FALSE;
goto Exit;
}
//查看是否发送端的下载文件已经准备好
if (subcmdcode != SUCCESS)
{
Print(L"Server not ready!Download fail!\n");
Status = FALSE;
goto Exit;
}
//获得待传文件长度
nResult = SocketRecvAll(SocketId, (CHAR8*)&FileLen, sizeof(UINT32));
if (nResult <0 )
{
Print(L"Socket Error, can't get File Length\r");
Status = FALSE;
goto Exit;
}
//=================================
//发送端OK,建立本地文件
//并向发送端报告状态
FileHandle=kwfopen( FileName, L"wb+" );
if(FileHandle==NULL)
{
Print(L"File %s create error! \n",FileName);
kwfclose(FileHandle);
//send a error to sender
hd.subcmdcode = ERROR;
nResult = SocketSend(SocketId,(CHAR8*)&hd, sizeof(SocketPackageHead));
if (nResult <0 )
{
Print(L"Socket Error, can't send fail message!\n\r");
Status = FALSE;
}
goto Exit;
}
hd.subcmdcode = SUCCESS;
nResult = SocketSend(SocketId,(CHAR8*)&hd, sizeof(SocketPackageHead));
if (nResult <0 )
{
Print(L"Socket Error, can't send success message!\n\r");
Status = FALSE;
goto Exit;
}
while (1)
{
//ready to recv response download file data
nResult = SocketRecvAll(SocketId, (CHAR8*)&hd, sizeof(SocketPackageHead));
subcmdcode = hd.subcmdcode;
if (nResult < 0)
{
Print(L"Socket Error to recv Filehead\n\r");
Status = FALSE;
goto Exit;
}
//receive close subcommand
if(hd.subcmdcode == ERROR)
{
Print(L"sendor is error!\n\r");
Status = FALSE;
goto Exit;
}
//检查是否是已经完成
if (hd.subcmdcode == DOWNLOADFILE_FINISH)
{
Print(L"Recv file success!\n\r");
Status = TRUE;
goto Exit;
}
Size = hd.packageLength - sizeof(hd);
pBuffer = MEM_ALLOC((UINTN)Size);
nResult = SocketRecvAll(SocketId, pBuffer, Size);
if (nResult <0)
{
Print(L"Socket Error to recv buffer data\n\r");
Status = FALSE;
MEM_FREE(pBuffer);
goto Exit;
}
totallen = kwfwrite( pBuffer, sizeof( CHAR8 ), Size, FileHandle );
if (totallen<Size) {
Print(L"- write file error - \n\r");
MEM_FREE(pBuffer);
hd.subcmdcode = ERROR;
nResult = SocketSend(SocketId, (CHAR8*)&hd, sizeof(SocketPackageHead));
goto Exit;
}
MEM_FREE(pBuffer);
hd.subcmdcode = SUCCESS;
nResult = SocketSend(SocketId, (CHAR8*)&hd, sizeof(SocketPackageHead));
Receved += Size;
Print(L"\r Progress: %d%%",(Receved*100)/FileLen);
}
Exit:
//if (Status==0)
//{
// fflush (FileHandle);
//}
if(FileHandle!=NULL)
kwfclose(FileHandle);
return Status;
}
//发送一个文件
INT32 SendFile(SOCKET_ID SocketId, CHAR16 *FileName)
{
EFI_FILE_HANDLE FileHandle;
INT32 subcmdcode;
SocketPackageHead hd;
INT32 nResult;
INT32 Status;
INT32 FileInfoSize = 0;
INT32 Size,FileLength,Sended;
CHAR8 *pBuffer;
CHAR16 tempstr[56];
INT32 aaa,bbb;
INT32 totallen;
RecvMessage(SocketId,tempstr,&aaa,&bbb);
Sended=0;
//向接收端发送本地准备好信号
FileHandle=kwfopen( FileName, L"rb" );
if(FileHandle==NULL)
{
Print(L"File %s open error \n\r",FileName);
//send a error to recever
hd.subcmdcode = ERROR;
nResult = SocketSend(SocketId, (CHAR8*)&hd, sizeof(hd));
if (nResult <0 )
{
Print(L"Socket Error, can't send fail message!\n\r");
Status = FALSE;
}
return FALSE;
}
//get file length
FileLength = (INT32)kwfsize(FileHandle);
Print(L"%s length is : %d\n\r",FileName,FileLength);
hd.subcmdcode = SUCCESS;
nResult = SocketSend(SocketId, (CHAR8*)&hd, sizeof(SocketPackageHead));
if (nResult <0 )
{
Print(L"Socket Error, can't send success message!\n\r");
Status = FALSE;
goto Exit;
}
//发送文件长度
nResult = SocketSend(SocketId, (CHAR8*)&FileLength, sizeof(UINT32));
if (nResult <0 )
{
Print(L"Socket Error, can't send file length!\n\r");
Status = FALSE;
goto Exit;
}
//========================================
//接收端准备好信号
nResult = SocketRecvAll(SocketId, (CHAR8*)&hd, sizeof(SocketPackageHead));
subcmdcode = hd.subcmdcode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -