socket图片文件传输示例Word文件下载.docx
《socket图片文件传输示例Word文件下载.docx》由会员分享,可在线阅读,更多相关《socket图片文件传输示例Word文件下载.docx(12页珍藏版)》请在冰点文库上搜索。
longcode;
intn,he=0,m=0,k=0,b=0;
char*p;
if(WSAStartup(MAKEWORD(2,0),&
wsaData)!
=0)
{
printf("
error1"
);
return-1;
}
if((listensocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
error2"
}
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(8889);
seraddr.sin_addr.s_addr=inet_addr("
127.0.0.1"
if(SOCKET_ERROR==bind(listensocket,(SOCKADDR*)&
seraddr,sizeof(seraddr)))
error3"
if(SOCKET_ERROR==listen(listensocket,5))
error4"
printf("
waitask"
sockmode=1;
if(SOCKET_ERROR==ioctlsocket(listensocket,FIONBIO,&
sockmode))
erroronioctl"
if((fp=fopen("
output.jpg"
"
rb"
))==NULL)//指定的文件是否存在
{//指定文件不存在
不能打开指定的文件!
\n"
fseek(fp,0,SEEK_END);
//读写指针移动到文件结尾
k=a.b=ftell(fp);
code=htonl(m);
//返回当前读写指针的位置,即得到文件长度。
p=(char*)&
k;
while
(1)
FD_ZERO(&
fdread);
FD_ZERO(&
fdwrite);
FD_SET(listensocket,&
for(inti=0;
i<
totalsock;
i++)
{
FD_SET(tempsocket,&
}
if(SOCKET_ERROR==(sockok=select(NULL,&
fdread,&
fdwrite,NULL,NULL)))
printf("
erroronselect"
return-1;
if(FD_ISSET(listensocket,&
fdread))
sockok--;
if(INVALID_SOCKET==(newconnection=accept(listensocket,(SOCKADDR*)&
cliaddr,&
cliaddrlen)))
{
printf("
error5"
return-1;
}
else
come"
totalsock++;
tempsocket=newconnection;
if(SOCKET_ERROR==ioctlsocket(newconnection,FIONBIO,&
memset(buf,0,sizeof(buf));
//memset(buf0,0,sizeof(buf0));
if(FD_ISSET(newconnection,&
memset(buf,0,sizeof(buf));
if(flag.b==2)
if(recv(newconnection,flag.a,sizeof(flag),0)<
0)
erroronrecvlong"
//if(a.b==0)a.b=2;
//else
//if(recv(newconnection,buf,sizeof(buf),0)==SOCKET_ERROR)
//{
//printf("
erroronrecvack"
//return-1;
//}
//if(strcmp(buf,"
exit"
)==0)
//{
conpletecopy"
//break;
fdwrite))
//gets(buf0);
if(a.b&
&
flag.b==0)
if((b=send(newconnection,a.a,sizeof(a),0))<
{
erroronsend"
//memset(a.a,0,sizeof(a));
}
flag.b=2;
if(flag.b==1)
//打开文件,并把文件内容发送到客户方,然后关闭文件和套接字
rewind(fp);
//文件读写指针移动到文件开头
while(!
feof(fp))//文件未结束
{
memset(buf,0,BUFLEN);
//清除缓存中的内容
n=fread(buf,1,BUFLEN,fp);
//读取文件内容到缓存
if(m=send(newconnection,buf,n,0))
if(m<
{
printf("
erroronsendmain"
m=GetLastError();
return-1;
}
if((he+=m)>
=k)
copycomplete"
}//send(clientSock,buf,n,0);
//把文件内容发送给客户方
}
fclose(fp);
break;
//if(strcmp(buf0,"
//break;
WSACleanup();
gets(buf);
exittoexit"
if(strcmp("
buf))
return0;
客户端:
#include<
iostream.h>
SOCKADDR_INcliaddr;
SOCKETscon;
charbuf0[50];
intn=0,m=0;
intj=0,k=0,l=0,q=0;
union{
}a;
//存储文件长度,用字符型指针做接收发送api的参数,然后用int型运算
intsockok;
ULONGsockmode=1;
=0)//初始化套接字空间
if((scon=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)//创建套接字
cliaddr.sin_family=AF_INET;
//初始化为ipv4族
cliaddr.sin_port=htons(8889);
//端口号
cliaddr.sin_addr.s_addr=inet_addr("
//ip地址
/*if(SOCKET_ERROR==bind(scon,(SOCKADDR*)&
cliaddr,cliaddrlen))//显示绑定套接字与地址信息
*/
connect...\n"
if(SOCKET_ERROR==connect(scon,(SOCKADDR*)&
cliaddr,cliaddrlen))//连接远端主机
error4connectfailed"
done\n"
if(SOCKET_ERROR==ioctlsocket(scon,FIONBIO,&
sockmode))//修改套接字为非阻塞
if(!
(fp=fopen("
input.jpg"
wb+"
)))//打开已有或创建一个二进制文件
erroronfopen"
for(inti=0;
;
i++)//死循环
FD_SET(scon,&
if((sockok=select(0,&
fdwrite,NULL,NULL))<
0)//选择出可读写的套接字用形参接收
if(m==-2)break;
//完成传送文件标志位m==-2
//memset(buf,0,sizeof(buf));
memset(buf0,0,sizeof(buf0));
//清缓存
//gets(buf);
//if(strcmp("
buf)==0)
//{
//printf("
exit.."
//return0;
//}
/*if(send(scon,buf,strlen(buf),0)==SOCKET_ERROR)
continue;
else
printf(buf0);
*/
//gets(p);
//n=(long)*p;
while(FD_ISSET(scon,&
fdread)&
(sockok--)&
(m!
=-2))//判断是否有可读套接字
if(l==0)//文件长度接收标志l==1为接收了
{
if((q=recv(scon,a.a,sizeof(a),0))<
0)//接收文件长度
printf("
return-1;
l=1;
if(l==2)//文件长度接收并返回确认信息了
memset(buf0,0,sizeof(buf0));
while((n=recv(scon,buf0,sizeof(buf0),0))>
0)//接收主文件
//continue;
m=fwrite(buf0,n,1,fp);
memset(buf0,0,sizeof(buf0));
if((m==1)&
((a.b-=n)<
=0))//文件写入本地且文件接收长度达到文件长度 结束
cout<
<
a.b<
endl;
n<
m<
send(scon,"
strlen("
),0);
printf("
completecopy"
m=-2;
//printf("
complatecopy"
break;
if(FD_ISSET(scon,&
fdwrite)&
sockok--)
if(l==1)
if(send(scon,(char*)&
l,sizeof(&
l),0)<
0)//确认收到文件长度
return-1;
l=2;
/*else{
printf(buf0);
}*/
if(fp)
fclose(fp);
closesocket(scon);