关于一个多线程、断点续传的FTP服务程序!

本文介绍了一个使用多线程和自定义数据包格式实现的FTP服务程序,该程序支持断点续传功能,实测传输速度比传统方式快四倍以上。由于工作原因,文中并未详细展示所有异常处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近关注这方面的知识,自己在做一些尝试,自己定义数据包格式,按type类型判断重新传递还是续传。经测试,基本功能都不错,传递速度是radim的4倍多。另因工作关系,一些异常判断未在此处列出。

主要源码如下:

服务端:

 

//  server.cpp : Defines the entry point for the console application.
//

#include 
" stdafx.h "
#include 
< afx.h >
#include 
" winsock2.h "
#include 
" winbase.h "
#define  SIZE 20;

#pragma  comment(lib, "ws2_32.lib") 

int  readn(SOCKET fd, char   * bp, int  len);
int  sendn(SOCKET fd, char   * bp, int  len);
DWORD WINAPI clientthread(LPVOID lpparam);

// 文件信息
struct  fileinfo
{
    
int fileno;//文件号
    int type;//消息类别。有三种有效的取值:0/1/2
    long len;//文件长度
    int seek;//开始位置
    char name[100];//文件名
}
;

struct  filesendinfo
{
    
char name[100];
    
int length;//INT,32位的数据。所以,应该占四个字节。
    int date;
}
;

int  main( int  argc,  char *  argv[])
{
    WSADATA       wsaData;
    SOCKET        ListeningSocket;
    SOCKET        NewConnection;
    SOCKADDR_IN ServerAddr,ClientAddr;
    
int ClientAddrLen;
    
int port = 1863;

    WSAStartup(MAKEWORD(
2,2),&wsaData);

    ListeningSocket 
= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    ServerAddr.sin_family 
= AF_INET;
    ServerAddr.sin_port 
= htons(port);
    ServerAddr.sin_addr.s_addr 
= htons(INADDR_ANY);

    bind(ListeningSocket,(SOCKADDR 
*)&ServerAddr,sizeof(ServerAddr));

    listen(ListeningSocket,
30);
    


    
while(1)
    
{
        ClientAddrLen
=sizeof(ClientAddr);
        NewConnection 
= accept(ListeningSocket,(SOCKADDR *)&ClientAddr,&ClientAddrLen);    
        
char buffer[20];
        _itoa(NewConnection,buffer,
20);
        printf(
"创建连接套按字:");
        printf(buffer);
        
if(INVALID_SOCKET!=NewConnection)
        
{             
            
//创建客戶功能线程,將NewConnection套接字傳給新線程
            HANDLE  hThread;  
            DWORD dwThread;
            
            
hThread=CreateThread(NULL,0,clientthread,(LPVOID)NewConnection,0,NULL);
              if(hThread==NULL)
              
{  
              printf(
"CreatThread  clientthread()  failed. ");  
              }
  
              
else  
              
{  
              printf(
"CreateThread  OK. ");  
              }


    
      CloseHandle(hThread);

        }
        
        closesocket(NewConnection);
        
    }
    

    
//closesocket(ListeningSocket);
    WSACleanup();
    
return 0;
}



// ----------------------------------------------------------------
// “用来处理服务器与客户端的一次连接用的线程”的线程函数。
// 其参数是:连接用的socket。

DWORD WINAPI clientthread(LPVOID lpparam)
{
    
//文件消息
    fileinfo fiinfo;
    SOCKET  sConnect1
=(SOCKET)lpparam;
    
char 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值