利用流式套接字实现文件的传输
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用流式套接字实现文件的传输
buff=(char *)malloc(nFileLen);
iResult=fread(buff,1,nFileLen,f);
if(iResult!=nFileLen)
{
printf("读入文件错误!\");
return 0;
}
memset(sendline,0,MAXLINE);
memset(recvline,0,MAXLINE);
while(i!=nFileLen)
{
recvline[i]=*buff;
i++;
buff++;
}
//文件名传输结束
sprintf(sendline,"%s#%d%s",file,nFileLen,recvline);
iResult=send(s,sendline,sizeof(sendline),0);
if(iResult==SOCKET_ERROR)
{
printf("send函数调用错误,错误号:%d",WSAGetLastError()); return -1;
}
fclose(fp);
printf("文件发送完成!\");
return iResult;
}
服务器:
int tcp_server_fun_echo(SOCKET s)
{
FILE *fp;
int i=0;
char flong[4];
int iResult = 0;
uint32_t nFileLen=1;
char recvline[MAXLINE];
char file[10];
memset(file,0,sizeof(file));
memset(recvline,0,sizeof(recvline));
for(;;)
{
iResult=recv(s,&file[i],1,0);
if(iResult==SOCKET_ERROR)
{
printf("recv函数调用错误,错误号:%d",WSAGetLastError()); return -1;
}
if(file[i]=='#')
break;
else
i++;
}
file[i]='\\0';
fp=fopen(file,"w+");
if(fp==NULL)
printf("文件打开失败!");
//接收文件长度
iResult=recv(s,flong,4,0);
if(iResult==SOCKET_ERROR)
{
printf("recv函数调用错误,错误号:%d",WSAGetLastError()); return -1;
}
sscanf(flong,"%d",&nFileLen);
iResult=recv(s,recvline,nFileLen,0);
if(iResult==SOCKET_ERROR)
{
printf("recv函数调用错误,错误号:%d",WSAGetLastError()); return -1;
}
fputs(recvline,fp);
fclose(fp);
printf("文件接收成功!\");
return iResult;
}
头文件(上次的实验报告中已经写过):
#ifndef p_h//预处理指令,防止重复包含头文件
#include
#include
#include
#include
#include
#pragma coment(lib,"ws2_32.lib")
using namespace std;
class CSocketFrame
{
public:
int start_up();
int clean_up();
int set_address(char *hname,char *sname,struct sockaddr_in *sap,char *protocol);
int quit(SOCKET s);
SOCKET tcp_server(ULONG uIP,USHORT uPort);
SOCKET tcp_server(char *hname,char *sname);
SOCKET tcp_client(char *hname,char *sname);
SOCKET tcp_client(ULONG uIP,USHORT uPort);
};
int CSocketFrame::start_up(void)
{
WORD wVersionRequested;
WSADATA wsaData;
int iResult;
wVersionRequested=MAKEWORD(2,2);
iResult=WSAStartup(wVersionRequested,&wsaData);
if(iResult!=0)
{
printf("WSAStartup 调用错误,错误号:%d\",WSAGetLastError());
return -1;
}
/*
if(LOBYTE(wsaData.wVersion!=2||HIBYTE(wsaData.wVersion)! =2))
{
printf("无法找到可用的WSD版本\");
WSACleanup();
return -1;
//告诉用户无法找到可用的WSD
}
else
{
printf("WS2.2初始化成功!\");
} */
return 0;
}
int CSocketFrame::clean_up(void)
{
int iResult;
iResult=WSACleanup();
if(iResult==SOCKET_ERROR)
{
//WSACleanup()调用失败
printf("WSACleanup 调用错误,错误号:%d\",WSAGetLastError());
return -1;
}
else
printf("Winsocket dll释放成功!\") ;
return 0;
}
int CSocketFrame::set_address(char *hname,char *sname,struct sockaddr_in *sap,char *protocol) {
struct servent *sp;
struct hostent *hp;
char *endptr;
unsigned short port;
unsigned long ulAddr=INADDR_NONE;
//将地址结构socketsddr_in初始化为0,并将地址族设为AF_INET
memset(sap,0,sizeof(*sap));
sap->sin_family=AF_INET;
if(hname!=NULL)
{
//如果hname不为空,转化地址格式
ulAddr=inet_addr(hname);
if(ulAddr==INADDR_NONE||ulAddr==INADDR_ANY)
{
//调用错误,调用gethostbyname获得主机地址
hp=gethostbyname(hname);
if(hp==NULL)
{
printf("未知的主机名,错误号:%d\",WSAGetLastError());
return -1;
}
sap->sin_addr=*(struct in_addr *)hp->h_addr;
}
else
sap->sin_addr.S_un.S_addr=ulAddr;
}
else
//如果调用者没有指明一个主机名或地址,则设为通配地址
sap->sin_addr.s_addr=htonl(INADDR_ANY);
//尝试转换sname为一个整数
port=(unsigned short)strtol(sname,&endptr,0);
if(*endptr=='\\0')
{
//如果成功转化为网络字节序
sap->sin_port=htons(port);
}
else
{
//如果失败,则假定是一个服务名称,通过getservbyname()函数获得端口号
sp=getservbyname(sname,protocol);
if(sp==NULL)
{
printf("未知服务,错误号:%d\",WSAGetLastError());
return -1;
}
sap->sin_port=sp->s_port;
}
return 0;
}
int CSocketFrame::quit(SOCKET s)
{
int iResult=0;
iResult=closesocket(s);
if(iResult==SOCKET_ERROR)
{
printf("closesocket 调用错误,错误号:%d\",WSAGetLastError());
return -1;
}
iResult=clean_up();
return iResult;
}
SOCKET CSocketFrame::tcp_server(char *hname,char *sname) {
SOCKET ListenSocket;
int iResult=0;
sockaddr_in local;
const int on=1;
//为服务器的本机地址设置用户输入的地址以及端口号
if(set_address(hname,sname,&local,(char*)"tcp")!=0)
return -1;
//创建套接字
ListenSocket=socket(AF_INET,SOCK_STREAM,0);
if(ListenSocket==INVALID_SOCKET)
{
printf("socket函数调用错误,错误号:%d\",WSAGetLastError());
WSACleanup();
return -1;
}
//绑定服务器地址
iResult=bind(ListenSocket,(struct sockaddr *) & local,sizeof(local));
if(iResult==-1)
{
printf("bind函数调用错误!错误号:%d\",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return -1;
}
//设置函数为监听状态,监听队列长度为NLISTEN
iResult=listen(ListenSocket,SOMAXCONN);
if(iResult==SOCKET_ERROR)
{
printf("Listen函数调用错误!错误号:%d\",WSAGetLastError());
quit(ListenSocket);
return -1;
}
return ListenSocket;
}
SOCKET CSocketFrame::tcp_server(ULONG uIP,USHORT uPort)
{
SOCKET ListenSocket=INVALID_SOCKET;
int iResult=0;
sockaddr_in local;
const int on=1;
//为服务器的本机地址设置用户输入的地址以及端口号
memset(&local,0,sizeof(local));
local.sin_family=AF_INET;
local.sin_addr.S_un.S_addr=htonl(uIP);
local.sin_port=htons(uPort);
ListenSocket=socket(AF_INET,SOCK_STREAM,0);
if(ListenSocket==INVALID_SOCKET)
{
printf("socket函数调用错误,错误号:%d\",WSAGetLastError());
clean_up();
return -1;
}
//绑定服务器地址
iResult=bind(ListenSocket,(struct sockaddr *) & local,sizeof(local));
if(iResult==SOCKET_ERROR)
{
printf("bind函数调用错误!错误号:%d\",WSAGetLastError());
quit(ListenSocket);
return -1;
}
//设置函数为监听状态,监听队列长度为NLISTEN
iResult=listen(ListenSocket,SOMAXCONN);
if(iResult==SOCKET_ERROR)
{
printf("Listen函数调用错误!错误号:%d\",WSAGetLastError());
quit(ListenSocket);
return -1;
}
return ListenSocket;
}
SOCKET CSocketFrame::tcp_client(char *hname,char *sname) {
int iResult=0;
struct sockaddr_in peer;
SOCKET ClientSocket;
//为服务器的地址peer设置用户输入的地址以及端口号
if(set_address(hname,sname,&peer,(char *)"tcp")!=0)
return -1;
//创建套接字
ClientSocket=socket(AF_INET,SOCK_STREAM,0);
if(ClientSocket==INVALID_SOCKET)
{
printf("socket函数调用错误,错误号:%d\",WSAGetLastError());
clean_up();
return -1;
}
//请求建立连接
iResult=connect(ClientSocket,(struct sockaddr *) & peer,sizeof(peer));
if(iResult==SOCKET_ERROR)
{
printf("connect函数调用错误!错误号:%d\",WSAGetLastError());
quit(ClientSocket);
return -1;
}
return ClientSocket;
}
SOCKET CSocketFrame::tcp_client(ULONG uIP,USHORT uPort) {
int iResult=0;
struct sockaddr_in peer;。