资源简介
P2P文件传输,实现上传和下载功能,用于局域网内部的文件传输。
代码片段和文件信息
#include “P2P_Download_Client.h“
int main(void)
{
char url[MAX] = “p2p://192.168.100.27/home/okfile/200792611456486_2.jpg“;
do_P2P_Download(url);
}
int do_P2P_Download(char* url)
{
int ret = 0 len = 0 total_len = 0 wlen = 0;
FILE *fp;
P2P_MESSAGE* message;
P2P_FILE_BE* file_be;
char buf[1024];
char mark_name[256];
char temp[256];
message = p2p_URL_Analyse(url);
if (message != NULL)
{
//建立socket连接
int sfd = socket_connect(message->ip 8010);
if (sfd < 0)
{
printf(“socket_connect failed.\n“);
return -1;
}
//开始发送命令,发送命令和文件地址
printf(“socket_connect successed\n“);
memset(buf 0 sizeof(buf));
strcpy(buf “GET_DATA“);
strcat(buf “#“);
strcat(buf message->file_addr);
printf(“命令和文件地址:%s\n“ buf);
//发送接受文件命令
ret = send(sfd buf strlen(buf) 0);
if (ret < 0)
{
perror(“send error\n“);
return -1;
}
//保存本地的标记文件
strcpy(mark_name message->file_name);
strcat(mark_name “.mark“);
//发送文件开始结束字jie
memset(buf 0 sizeof(buf));
//strcpy(buf “0#10000#10000“);
/*ret = send(sfd buf strlen(buf) 0);
if (ret < 0)
{
perror(“send error\n“);
return -1;
}*/
//接受數據文件
fp = fopen(message->file_name “wb“);
printf(“message->file_name:%s\n“ message->file_name);
if (fp == NULL)
{
perror(“fopen“);
return -1;
}
printf(“fopen file ok\n“);
//接受文件数据
while (1)
{
memset(buf 0 sizeof(buf));
len = recv(sfd buf sizeof(buf) 0);
printf(“recved :%d\n“ len);
if (len < 0)
{
perror(“recv“);
break;
}
else if (len == 0)
{
printf(“recv over\n“);
break;
}
else
{
if ((strcmp(buf “error“) == 0) || (strcmp(buf “file_open_error“) == 0))
{
printf(“server has something wrong!\n“);
break;
}
wlen = fwrite(buf 1 len fp);
printf(“fwrite:%d\n“ wlen);
if (wlen < len)
{
perror(“fwrite“);
break;
}
else if (wlen == 0) //调用不成功
{
printf(“fwrite error\n“);
break;
}
else
{
printf(“fwrite OK\n“);
}
}
total_len += len;
}
printf(“recved total length:%d\n“ total_len);
close(fp);
//写入到标记文件中
fp = fopen(mark_name “wb“);
if (fp == NULL)
{
perror(“fopen“);
return -1;
}
memset(buf 0 sizeof(buf));
strcpy(buf “0#“);
sprintf(temp “%d“ total_len);
strcat(buf temp);
strcat(buf “#“);
strcat(buf temp);
fwrite(buf 1 strlen(buf) fp);
fclose(fp);
}
return 0;
}
int socket_connect(char* ip int port)
{
int sockfd;
int bind_ret;
socklen_t len;
//设置地址结gou
struct sockaddr_in client_addr;
struct sockaddr_in server_addr;
//初始化地址结购
memset(&client_addr0sizeof(client_addr));
memset(&server_addr0sizeof(client_addr));
//填充客户端地址结构中的值
client_addr.sin_family=AF_INET;
client_addr.sin_addr.s_addr=htons(INADDR_ANY);
client_addr.sin_port=htons(0);//当port为0的时候表示让系统随机选择一个端口号
//create socket
sockfd=socket(AF_INETSOCK_STREAM0);
if(sockfd < 0)
{
printf(“create socket failed.\n“);
return -1;
}
//bind 地
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1744 2014-12-17 21:05 P2P_Download_Server.h
文件 5472 2014-12-17 21:35 P2P_Download_Client.c
文件 1240 2014-12-17 21:08 P2P_Download_Client.h
文件 5538 2014-12-17 21:33 P2P_Download_Server.c
----------- --------- ---------- ----- ----
13994 4
- 上一篇:设置RichTextBox的文本对齐方式
- 下一篇:点名册.exe
相关资源
- IndexView上网记录、文件历史查看器
- 基于socket的文件传输软件的设计与实
- ec2108hoe文件
- 模拟FAT文件系统的设计与实现
- pdf文件实现放大缩小功能
- freetype的Lib、头文件及调用样例
- 将文件中的单词统计存入另一文件
- 寻址方式动画演示文件
-
全国主要公路铁路gis地图shp,xm
l, - 一个exe可执行文件的生与死运行原理
- 全国大学生数学建模竞赛论文格式规
- 上传图片.zip
- Burp Suite Pro 2最新版 破解文件(原版文
- threejs加载obj文件
- OSG 程序 flt 模型文件 转换
- VCSEL激光器的Pspice模型文件
- 支持计划任务和通配符指定文件名的
- ad7794_spi操作源文件
- 自适应中值滤波,比之前发的那个好
- Sony F828 Raw 文件格式解码
- arcgis10.5 portal和server授权文件
- CSpreadSheet类含头文件.h和.cpp.rar
- 压缩一个目录下的指定类型文件的r
- weka Id3分类算法操作详解文件包
- ubuntu和centos通用的smb.conf文件
- 用blender打开ski模型文件的脚本
- Arduino HMC5883L库文件
- 计算文件哈希值的程序
- jni.h头文件
- vimrc配置文件
评论
共有 条评论