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

📄 bookclient.cpp

📁 通过socket编程
💻 CPP
字号:


#include "Winsock.h"
#include "windows.h"
#include "stdio.h"
#pragma comment(lib,"wsock32.lib")
#define RECV_PORT 2000
#define SEND_PORT 3000
#define MAX_FILESIZE 64*1024
#define SERVERADDR "127.0.0.1"

SOCKET sock;
sockaddr_in ServerAddr;
int len =sizeof(ServerAddr);

struct Filedata
{
    char ffname[30];
    char ffdata[MAX_FILESIZE];
    int len;
}DataPacket;

DWORD StartSock()
{
    WSADATA WSAData;
    if (WSAStartup(MAKEWORD(2,2),&WSAData)!=0)        //初始化套接字
    {
        printf("sock init fail!\n");
        return(-1);
    }
   
    return(1);
}

DWORD CreateSocket(char ip[])
{
    sock=socket(AF_INET,SOCK_STREAM,0);                //创建套接字
    
    if (sock==SOCKET_ERROR)
    {
        printf("sock create fail!\n");
        WSACleanup();
        return(-1);
    }
	 ServerAddr.sin_family=AF_INET;                    //填充服务器地址端口号
    ServerAddr.sin_addr.s_addr=inet_addr(ip);
    ServerAddr.sin_port=htons(RECV_PORT);
	printf("connect ok! \n");	
    return(1);
}

void CallServer(char ip[])
{
    CreateSocket(ip);
    if (connect(sock,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
    {
        printf("Connect ... \n");
    }
}

DWORD GetFile(char *fname)                     //由文件全名打开文件
{
    FILE *fp;
    int Filesize;
    int i;
    //char c;
    int count,total=0;
    char buffer[100];
    char Senddata[MAX_FILESIZE];
    fp=fopen(fname,"r");

    if (fp==NULL)
    {
        printf("can not open this file\n");
        return(0);
    }
    i=0;
    Filesize=0;
    memset(Senddata,0,MAX_FILESIZE);
    while(!feof(fp))
    {
        count =fread(buffer,sizeof(char),100,fp);        //读文件,一次读入100个字节
        if (ferror(fp))
        {
            printf("Read File error");
            break;
        }
        Filesize+=count;
        if (Filesize>MAX_FILESIZE)                        //文件大于32KB,出错
        {
            printf("your file is too big\n");
            fclose(fp);
            return(0);
        }
        memcpy(&Senddata[i],buffer,count);
        i+=count;
    }
    fclose(fp);
    Senddata[i]='\0';
    strcpy(DataPacket.ffname,fname);
    memcpy(DataPacket.ffdata,Senddata,Filesize);
    DataPacket.len=Filesize;
    printf("The file is :%s %dB\n",DataPacket.ffname,DataPacket.len);
    return(1);
}


DWORD TCPSendPacket(struct Filedata Packet,SOCKET s)            //FTP传输函数,通过Socket发送
{
    int length;
    length=send(s,(char *)&Packet,sizeof(DataPacket),0);
    
    if (length<=0)
    {
        printf("send Filedata error!\n");
        closesocket(sock);
        WSACleanup();
        return(-1);
    }
    return(1);
}



DWORD WriteFile(char *fname,char *fdata,int flen)   //写文件函数
{
    int i;
    FILE *fp;
    fp=fopen(fname,"w");
    if (fp==NULL)
    {
        printf("can not open this file\n");
    }
    i=0;
    for (i=0;i<flen;i++)
    {
        fputc(fdata[i],fp);                    //逐个字节写入文件
    }
    fclose(fp);
    return(1);
}








void FTPSevice()
{
	char sendfilename[30];
	char buf[30];
	char banner[10][30];        //导航框
	int i,j;
	char select[30];

	system("cls");   //清屏准备输出导航框

	if (recvfrom(sock,banner[0],sizeof(banner),0,(struct sockaddr*)&ServerAddr,&len) != SOCKET_ERROR)
	for(i=0;i<10;i++)    //输出导航框
	{	
                for(j=0;j<30;j++)
		 {printf("%c",banner[i][j]);
		Sleep(1);  }
		printf("\n");		
	}



	Sleep(100);

while(1)
{
		printf("\nYou can choose download upload or exit now!\n");
			scanf("%s",select);

		sendto(sock,select,sizeof(select),0,(struct sockaddr*)&ServerAddr,sizeof(ServerAddr));


///////////用户上载
		if(strcmp(select,"upload")==0)
		{
			while(1)
			 {
        printf("please input the filename to send!\n"); //输入要上传的文件
        scanf("%s",sendfilename);
        
        if (GetFile(sendfilename)==0)                   //获得要上传的文件
            continue;

        TCPSendPacket(DataPacket,sock);                 //上传文件
		break;
			   }
			continue;
   
		}


/////////用户下载

	else	if(strcmp(select,"download")==0)
	{
		  Sleep(200);
		  if (recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&ServerAddr,&len) != SOCKET_ERROR)  //接收服务器发来的下载信息
          printf("receive from server:%s\n",buf);
		  scanf("%s",sendfilename);                                                                 //输入要下载的文件
		  sendto(sock,sendfilename,sizeof(sendfilename),0,(struct sockaddr*)&ServerAddr,sizeof(ServerAddr));//向服务器发送要下载的文件的全名
		  Sleep(500);
					
		 while(1)
        {
            memset(DataPacket.ffname,0,30);		             //为将要下载的文件开辟缓存空间
            memset(DataPacket.ffdata,0,MAX_FILESIZE);
            DataPacket.len=0;
			Sleep(200);
             if (recv(sock,(char *)&DataPacket,sizeof(DataPacket),0)<=0)       //接收文件    
            {
                break;
            }	
            printf("Has received file: %s ,length is %dB ",DataPacket.ffname,DataPacket.len);
			DataPacket.ffname[0]='F';                                          //全名改在F盘
           WriteFile(DataPacket.ffname,DataPacket.ffdata,DataPacket.len);      //在F盘对应ftp文件夹写入文件
            printf("\nThe file save in :%s\n\n",DataPacket.ffname);
			break;
		}
	}

		

////////////////////用户选择退出
		else	if(strcmp(select,"exit")==0)
			{	printf("\nClient exit!\n");
			    closesocket(sock);   
				exit(0);}

///////////////////用户输入错误!		
			else {
	printf("input wrong!!\n you must input \" download \" \" upload \" or \" exit \"!!\n");
				}

}
}







void main()
{
	char ip[10];
	printf("please input the IP of FTP server:\n");
	scanf("%s",ip);     //输入FTP服务器的ip地址
    StartSock();        //初始化
    CallServer(ip);     //连接FTP服务器
	printf("\n"); 
	Sleep(800);
    FTPSevice();         //开始FTP服务
   
}

⌨️ 快捷键说明

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