⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftpsocket.c

📁 EFI(Extensible Firmware Interface)是下一代BIOS
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************
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 + -