socket实现文件传输

yangkunhenry 2009-06-09 07:56:48

//服务器端
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData);
if ( err != 0 )
{
return 1;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return 1;
}
SOCKET socksrv=socket(AF_INET,SOCK_STREAM,0);

sockaddr_in sasrv;
sasrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sasrv.sin_family=AF_INET;
sasrv.sin_port=htons(4000);

bind(socksrv,(sockaddr*)&sasrv,sizeof(sockaddr));

listen(socksrv,5);

sockaddr_in sacon;
int salen=sizeof(sockaddr);
FILE *file=fopen("D:\\3.txt","w");//接收的数据放入文件3.txt中
if(!file)
{
printf("faile to open file!");
return 1;
}
int count=1;
while(1)
{
SOCKET sockcon=accept(socksrv,(sockaddr*)&sacon,&salen);

char sendbuf[100];
sprintf(sendbuf,"Welcome %s connect me!",inet_ntoa(sacon.sin_addr));
send(sockcon,sendbuf,strlen(sendbuf)+1,0);

char recvbuf[100];
memset(recvbuf,0,100);
recv(sockcon,recvbuf,100,0);
printf("%s",recvbuf);
fputs(recvbuf,file);
//如果在这之后直接break 的话可以得到一行数据,但是我想得到客户端发送的所有数据怎么处理

if(strlen(recvbuf)==0)
{
closesocket(sockcon);
break;
}
closesocket(sockcon);
}
fclose(file);
WSACleanup();
return 0;
}


//客户端
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return 1;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return 1;
}
SOCKET sockcli=socket(AF_INET,SOCK_STREAM,0);

sockaddr_in sacli;
sacli.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sacli.sin_family=AF_INET;
sacli.sin_port=htons(4000);

connect(sockcli,(sockaddr*)&sacli,sizeof(sockaddr));

char recvbuf[100];
recv(sockcli,recvbuf,100,0);
printf("%s\n",recvbuf);

FILE* file=fopen("D:\\2.txt","r");
if(!file)
{
printf("error!");
return 1;
}
char buf[100];

while(fgets(buf,100,file))//将2.txt文件中的数据发送
{
send(sockcli,buf,strlen(buf)+1,0);
printf("%s",buf);
}
send(sockcli,"end!",strlen("end!")+1,0);
fclose(file);
closesocket(sockcli);
WSACleanup();


return 0;
}

谢谢!
...全文
175 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pingpo 2009-06-09
  • 打赏
  • 举报
回复
网络编程的原理可以好好看看。很有价值。
I/O模型等。

自己都感觉写得很差。你这一说。。更让我。。。
三个月没有编程,写个简单的C/S通信都好卡。真是感慨...。。哎。。。

oh...my god.
借楼主帖子,发发牢骚。
nanjingling88 2009-06-09
  • 打赏
  • 举报
回复
DDDDDDDDDDD
yangkunhenry 2009-06-09
  • 打赏
  • 举报
回复
乒*乓大哥谢谢你了!!!!写的很好!
pingpo 2009-06-09
  • 打赏
  • 举报
回复

// 先说明一下,这个代码写的很垃圾。MP3可以传输。具体情况看注释。
// 啰嗦一下,现在很少写代码了。。把原本就不清楚不清楚C基础,和SOCKET忘记干净了。时间真是摧毁记忆。


// 客户端
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return 1;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return 1;
}
SOCKET sockcli=socket(AF_INET,SOCK_STREAM,0);

sockaddr_in sacli;
sacli.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sacli.sin_family=AF_INET;
sacli.sin_port=htons(4000);

connect(sockcli,(sockaddr*)&sacli,sizeof(sockaddr));

char recvbuf[100];
recv(sockcli,recvbuf,100,0);
printf("%s\n",recvbuf);

FILE* file=fopen("D:\\2.mp3","rb"); // 读写二进制文件 记得 加 b

if(!file)
{
printf("error!");
return 1;
}


char data[100]={0};
int len=0;
int i=0;

while ((len=fread(data,1,100,file))>0 )
{
send(sockcli,data,len,0);
i++;
printf("i=%d len=%d\n",i,len);
}
fclose(file);
closesocket(sockcli);
WSACleanup();
return 0;
}

//服务器
// fuwu.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData);
if ( err != 0 )
{
return 1;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return 1;
}
SOCKET socksrv=socket(AF_INET,SOCK_STREAM,0);

sockaddr_in sasrv;
sasrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sasrv.sin_family=AF_INET;
sasrv.sin_port=htons(4000);

bind(socksrv,(sockaddr*)&sasrv,sizeof(sockaddr));

listen(socksrv,5);

sockaddr_in sacon;
int salen=sizeof(sockaddr);
FILE *file=fopen("D:\\3.mp3","wb");//接收的数据放入文件3.txt中


if(!file)
{
printf("faile to open file!");
return 1;
}
int count=1;
SOCKET sockcon=accept(socksrv,(sockaddr*)&sacon,&salen);
if ( INVALID_SOCKET==sockcon)
{
printf("accept error");
return 0;
}else
{
char msg[100]={0};
sprintf(msg,"Welcome %s connect me!",inet_ntoa(sacon.sin_addr));
send(sockcon,msg,strlen(msg)+1,0);
}

char data[100];
int retlen=0;
int i=0;
while(1)
{
memset(data,0,100);
retlen=recv(sockcon,data,100,0);
if (retlen<=0)
{
break;
}
fwrite(data,1,retlen,file);
i++;
printf("retlen=%d i=%d\n",retlen,i);

}
closesocket(sockcon);
fclose(file);
WSACleanup();
return 0;
}

//功能我电脑上通过测试.VC6.0. 代码自己看了都无言了。
// 写的丑陋不合理的地方,希望朋友们指出来。不要让我误导楼主了。
yangkunhenry 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pingpo 的回复:]
strlen()
不要用这个来计算 数据的长度。
[/Quote]
哦,我改了,不用strlen了。
pingpo 2009-06-09
  • 打赏
  • 举报
回复
strlen()
不要用这个来计算 数据的长度。
yangkunhenry 2009-06-09
  • 打赏
  • 举报
回复
上面1搂很对,现在可以传输文本文件了,不过在传送mp3文件就不行了,
比如在传输一个5M的mp3文件,只能得到十几K的数据。
利用socket怎么传输mp3文件?谢谢。
蜥蜴枪王 2009-06-09
  • 打赏
  • 举报
回复
哎 友情帮顶
yangkunhenry 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pingpo 的回复:]
fputs(recvbuf,file);
//如果在这之后直接break 的话可以得到一行数据,但是我想得到客户端发送的所有数据怎么处理

问楼主 这个什么意思?
【客户端发送的所有数据】是服务器把整个文件传输完,在做处理吗?
还是什么意思?
[/Quote]
就是想得到客户端发送的所有数据,而不仅仅只有一行数据。
(因为我在fputs之后加上break只能得到客户端发送的一行数据,而不加break,连一行数据也得不得。不知道说清了没。)
hz_yck 2009-06-09
  • 打赏
  • 举报
回复
while(1)
{
memset(recvbuf,0,100);
recv(sockcon,recvbuf,100,0);
printf("%s",recvbuf);
fputs(recvbuf,file);
//如果在这之后直接break 的话可以得到一行数据,但是我想得到客户端发送的所有数据怎么处理

if(strlen(recvbuf)==0) //改下跳出条件吧,找找EOF之类的,或者改下客户端发送数据的格式
{
closesocket(sockcon);
break;
}
// closesocket(sockcon); 注释掉了,刚才没仔细看
}
fclose(file);
WSACleanup();
return 0;
}
pingpo 2009-06-09
  • 打赏
  • 举报
回复
fputs(recvbuf,file);
//如果在这之后直接break 的话可以得到一行数据,但是我想得到客户端发送的所有数据怎么处理

问楼主 这个什么意思?
【客户端发送的所有数据】是服务器把整个文件传输完,在做处理吗?
还是什么意思?

hz_yck 2009-06-09
  • 打赏
  • 举报
回复
//服务器端
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData);
if ( err != 0 )
{
return 1;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return 1;
}
SOCKET socksrv=socket(AF_INET,SOCK_STREAM,0);

sockaddr_in sasrv;
sasrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sasrv.sin_family=AF_INET;
sasrv.sin_port=htons(4000);

bind(socksrv,(sockaddr*)&sasrv,sizeof(sockaddr));

listen(socksrv,5);

sockaddr_in sacon;
int salen=sizeof(sockaddr);
FILE *file=fopen("D:\\3.txt","w");//接收的数据放入文件3.txt中
if(!file)
{
printf("faile to open file!");
return 1;
}
int count=1;

SOCKET sockcon=accept(socksrv,(sockaddr*)&sacon,&salen);

char sendbuf[100];
sprintf(sendbuf,"Welcome %s connect me!",inet_ntoa(sacon.sin_addr));
send(sockcon,sendbuf,strlen(sendbuf)+1,0);

char recvbuf[100];

while(1)
{
memset(recvbuf,0,100);
recv(sockcon,recvbuf,100,0);
printf("%s",recvbuf);
fputs(recvbuf,file);
//如果在这之后直接break 的话可以得到一行数据,但是我想得到客户端发送的所有数据怎么处理

if(strlen(recvbuf)==0)
{
closesocket(sockcon);
break;
}
closesocket(sockcon);
}
fclose(file);
WSACleanup();
return 0;
}

试试看

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧