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

📄 comm.cpp

📁 一个用来模拟FTP工作流程的小程序
💻 CPP
字号:
#include "Comm.h"

WSADATA wsaData;
SOCKET m_socket;
SOCKET m_backup;
sockaddr_in con;
SOCKET AcceptSocket;

//构造函数
WComm::WComm()
{

    
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) 
	{
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return;
    }

	m_backup = m_socket;


}

//启动服务器函数
int WComm::startServer(int port)
{
	
   
    con.sin_family = AF_INET;
    con.sin_addr.s_addr = inet_addr( "0.0.0.0" );
    con.sin_port = htons( port );


	if ( bind( m_socket, (SOCKADDR*) &con, sizeof(con) ) == SOCKET_ERROR) 
	{
        //printf( "Failed to bind.\n" );
        WSACleanup();
        return 0;
    }


    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
	{
        //printf( "Error listening on socket.\n");
		return 0;
	}
	return 1;

}

//等待连接函数
void WComm::waitForClient()
{
	AcceptSocket = SOCKET_ERROR;

    while ( AcceptSocket == SOCKET_ERROR ) 
	{
		AcceptSocket = accept( m_backup, NULL, NULL );
    }

	m_socket = AcceptSocket;
}
//断开连接函数
void WComm::closeConnection()
{
	closesocket(m_socket);
	m_socket = m_backup;
}

//数据发送函数
int WComm::sendData(char *sendbuf)
{
	return send( m_socket, sendbuf, strlen(sendbuf), 0 );
}
//数据接收函数
int WComm::recvData(char *recvbuf,int size)
{
	int sz = recv( m_socket, recvbuf, size, 0 );
	recvbuf[sz] = '\0';
	return sz;
}

int WComm::blocksendData(char *sendbuf, int size)
{
	return send( m_socket, sendbuf, size, 0 );
}


void WComm::fileReceive(char *f_path)
{
	char filename[256]="";
	char h_filename[256]="";
	char m_filename[10]="";
	char l_filename[10]="";
	char recfilename[32]="";
	HANDLE h;
	WIN32_FIND_DATA lpFindFileData ;
	int i,j,len,recs;
	char rec[32]="";
	
	strcat(filename,f_path);//得到服务器当前路径
	
	recv( m_socket, recfilename, 32, 0 ); //接受客户端发送的文件名称
	
	send( m_socket, "name received OK", strlen("name received OK"), 0 ); //发送反馈信息

	strcat(filename,"\\");
	strcat(filename,recfilename);//获得要创建的全路径文件名
	h=FindFirstFile(filename,&lpFindFileData);//判断是否有重名文件存在
	if(h!=INVALID_HANDLE_VALUE)//若存在重名文件
	{
		len=strlen(filename);
		for(i=len;i>=0;i--)
		{
			if(filename[i]=='.')
				break;
		}
		l_filename[0]=')';
		for(j=i;j<=len;j++)
			l_filename[j-i+1]=filename[j];
		filename[i]='(';
		filename[i+1]='\0';
		strcpy(h_filename,filename);
		for(i=1;i<256;i++)
		{
			itoa(i,m_filename,10);
			strcpy(filename,h_filename);
			strcat(filename,m_filename);
			strcat(filename,l_filename);
			h=FindFirstFile(filename,&lpFindFileData);
			if(h==INVALID_HANDLE_VALUE)
				break;			
		}

	}
	//create a file in server with filename
	FILE *fw = fopen(filename, "wb");

	//接收文件长度
	recs = recv( m_socket, rec, 32, 0 );//!!!!!!!!!!!!!!11	
	//发送反馈信息
	send( m_socket, "size received OK", strlen("size received OK"), 0 );//!!!!!!!!!!!!!

	rec[recs]='\0';
	int size = atoi(rec);
	while(size > 0)
	{
		char buffer[1030];

		if(size>=1024)
		{
			recv( m_socket, buffer, 1024, 0 );//!!!!!!!!!!!!!!!
			send( m_socket, "OK", strlen("OK"), 0 );//!!!!!!!!!!!!!!!!!
			fwrite(buffer, 1024, 1, fw);
		}
		else
		{
			recv( m_socket, buffer, size, 0 );//!!!!!!!!!!!!!!!!!!!!!!
			send( m_socket, "OK", strlen("OK"), 0 );//!!!!!!!!!!!!!!!!!
			buffer[size]='\0';
			fwrite(buffer, size, 1, fw);
		}

		size -= 1024;
	}
	fclose(fw);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -