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

📄 bookserver.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

SOCKET sock,sock1;
sockaddr_in ServerAddr;
sockaddr_in ClientAddr;

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

int Addrlen;

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

DWORD CreateSocket()                //初始化socket!
{
    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=htonl(INADDR_ANY);    
    ServerAddr.sin_port=htons(RECV_PORT);           

    if (bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
   
    {
        printf("bind is the error");
        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);
}

//客户端下载用到的函数
//////////////////////////////////////////////////////////////////////////////////////////////////


DWORD TCPSendPacket(struct Filedata Packet,SOCKET s)          //使用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 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\n",DataPacket.ffname,DataPacket.len);
    return(1);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////





















DWORD ConnectProcess()
{	
	char banner[10][30]={
	 						{'*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
	 					    {'*','\0','W','e','l','c','o','m','e','\0','t','o','\0','M','y','\0','F','T','P','!','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
	 					    {'*','Y','o','u','\0','c','a','n','\0','d','o','w','n','\0','o','r','\0','u','p','l','o','a','d','\0','h','e','r','e','!','*'},
	 					    {'*','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
	 					    {'*','Y','o','u','\0','c','a','n','\0','d','o','w','n','l','o','a','d','\0','o','r','\0','u','p','l','o','a','d','\0','\0','*'},
	 					    {'*','t','h','e','s','e','\0','f','i','l','e','s','\0','i','n','\0','t','h','i','s','\0','t','e','s','t',':','\0','\0','\0','*'},
	 					    {'*','\0','\0','D',':','\\','F','T','P','\\','t','e','s','t','1','.','t','x','t','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
	 					    {'*','\0','\0','D',':','\\','F','T','P','\\','t','e','s','t','2','.','t','x','t','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
	 					    {'*','\0','\0','D',':','\\','F','T','P','\\','t','e','s','t','3','.','t','x','t','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
	 					    {'*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'}
						};           //////////导航框
		
	char buf1[]="which files you want?";
	char select[30];
	char receivefilename[30];
	int len =sizeof(ServerAddr);
    Addrlen=sizeof(sockaddr_in);

    if (listen(sock,5)<0)         /////////服务器开始监听    
    {
        printf("Listen error");
        return(-1);

    }
    printf("Listening...\n");
    for (;;)
    {
        sock1=accept(sock,(struct sockaddr FAR *)&ClientAddr,&Addrlen);       //接受用户连接请求
		   printf("connect ok!\n");
		sendto(sock1,banner[0],sizeof(banner),0,(struct sockaddr*)&ClientAddr,sizeof(ClientAddr));//发给用户导航框

	 while (recvfrom(sock1,select,sizeof(select),0,(struct sockaddr*)&ServerAddr,&len) != SOCKET_ERROR)//等待用户输入命令
 {
////////////////////用户上载
	 if(strcmp(select,"upload")==0)
	 {
		 printf("Client upload!!\n");
        for (;;)
        {
            memset(DataPacket.ffname,0,30);
			
            memset(DataPacket.ffdata,0,MAX_FILESIZE);
            DataPacket.len=0;
            while (recv(sock1,(char *)&DataPacket,sizeof(DataPacket),0)<=0)           
            {
                break;
            }		
            printf("Has received file: %s ,length is %dB ",DataPacket.ffname,DataPacket.len);
			DataPacket.ffname[0]='F';
			printf("\nThe file save in:%s\n",DataPacket.ffname);
            WriteFile(DataPacket.ffname,DataPacket.ffdata,DataPacket.len);
			break;
        }
	 }


 
 //////////////////////////客户下载 
 else  if(strcmp(select,"download")==0)
		{
		  printf("Client download!!\n");
		  sendto(sock1,buf1,sizeof(buf1),0,(struct sockaddr*)&ClientAddr,sizeof(ClientAddr));
		
		 recvfrom(sock1,receivefilename,sizeof(receivefilename),0,(struct sockaddr*)&ServerAddr,&len);
			printf("The client will download this file: %s\n",receivefilename);   
			GetFile(receivefilename);
			TCPSendPacket(DataPacket,sock1);
		}
 ////////////////用户退出
	else	 if(strcmp(select,"exit")==0)
				{
					printf("Client exit!!\n");
					closesocket(sock1);
					closesocket(sock);
					return 1;
				}
	else {printf("\n Client input wrong!!\n");}
    }
	}
}

int main()
{
    if (StartSock()==-1)
        return(-1);
    if (CreateSocket()==-1)
        return(-1);

    if (ConnectProcess()==-1)   //开始FTP服务流程
        return(-1);
	
    return(1);
}

⌨️ 快捷键说明

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