Linux c++ socket写一个简单TCP文件服务器

Linux c++ socket写一个简单TCP文件服务器

首先输入操作download filename 或者 update filename,客户端将操作和文件名传送给服务器端,然后根据操作进行接收或者发送文件(服务器端发送或者接收文件),注意文件的路径不同
用一个结构体MyFile存放每次发送文件的长度(不是整个文件的长度)和文件的内容

下面是代码,有注释,(代码可以封装的更好):

//define.h

#include<iostream>
#pragma pack(1)  //单字节对齐
#define BUF_SIZE 1024 //每次读取文件内容的大小 
#define NAME_SIZE 128 //文件名大小 
#define OPR_SIZE 20 //输入的操作的数组的大小 
#define FILE_SIZE 128 //文件完整路径名的大小 
using namespace std;
struct MyFile{
	int size;  			//本次传输大小
	char buf[BUF_SIZE];  	//文件内容 
}; 

int MySend(int iSock,char* pchBuf,size_t tLen){	//把pchBuf里tLen长度数据发送出去,直到发送完为止 
	int iThisSend; //一次发送了多少数据 
	unsigned int iSended=0;		//已经发送了多少 
	if(tLen==0)
		return 0;
	while(iSended<tLen){
		do{
			iThisSend=send(iSock,pchBuf,tLen-iSended,0);
		}while((iThisSend<0)&&(errno==EINTR));		//发送的时候遇到了中断 
		if(iThisSend<0)
			return iSended;
		iSended+=iThisSend;
		pchBuf+=iThisSend;
	}
	return tLen;
} 

int MyRecv(int iSock,char* pchBuf,size_t tLen){
	int iThisRead;
	unsigned int iReaded=0;
	if(tLen==0)
		return 0;
	while(iReaded<tLen){
		do{
			iThisRead=read(iSock,pchBuf,tLen-iReaded);
		}while((iThisRead<0)&&(errno==EINTR));
		if(iThisRead<0)
			return iThisRead;
		else if(iThisRead==0)
			return iReaded;
		iReaded+=iThisRead;
		pchBuf+=iThisRead;
	}
}

void getOper(char a[],char c[]){	//将输入的要上传的文件路径分割出文件件名放在c数组中,例如 e://aaa.txt  c=aaa.txt 
	int i=0;
	for(;i<strlen(a)-1;i++){
		if((a[i]=='/'&&a[i+1]!='/')||(a[i]=='\\'&&a[i+1]!='\\'))
			break;
		else 
			c[i]=a[i];
//		cout<<i<<endl;
	}
	if(i==strlen(a)-1){
  //如果文件名里没有\ 或者/
		c[i]=a[i];
		return;
	}	
	int t=++i;
	for(;i<strlen(a);i++){
		c[i-t]=a[i];
		c[i+1]='\0';
	}
	c[i]='\0';
//	cout<
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值