以下是两个c函数,分别实现发送及接收文件(已封装成DLL),想知道怎么在Delphi中调用并实现文件传输功能??先谢谢大家了!!
int IBrcvfile(int sock,char *rcvfile)
{
int r,len,last=0;
char info[2],slen[5];
#ifndef MAXSTRINGLEN
#define MAXSTRINGLEN 128
#endif
#ifndef INFO_NORMAL
#define INFO_NORMAL "N"
#endif
#ifndef INFO_END
#define INFO_END "E"
#endif
#ifndef INFO_RESP
#define INFO_RESP "R"
#endif
char str[MAXSTRINGLEN],cmd[128];
FILE *fp;
memset(str,0,MAXSTRINGLEN);
fp=fopen(rcvfile,"w+");
if(fp==NULL)
{
return -1;
}
while(1)
{
memset(str, 0, MAXSTRINGLEN);
memset(slen, 0, sizeof(slen));
//IBcomlog_print(__FILE__,__LINE__,"read info");
r=read(sock,info,1);
if(r<0)
{
fclose(fp);
return -2;
}
//IBcomlog_print(__FILE__,__LINE__,"read info[%s]",info);
if(strncmp(info,INFO_END,1)!=0&&strncmp(info,INFO_NORMAL,1)!=0)
{
fclose(fp);
return -3;
}
if(!strncmp(info,INFO_END,1))
last=1;
r=read(sock,slen,4);
//IBcomlog_print(__FILE__,__LINE__,"read slen=[%s]",slen);
if(r!=4)
{
fclose(fp);
return -4;
}
len=atoi(slen);
r=read(sock,str,len);
//IBcomlog_print(__FILE__,__LINE__,"read buf[%s] r=%d",str,r);
if(r!=len)
{
fclose(fp);
return -5;
}
//IBcomlog_print(__FILE__,__LINE__,"write resp");
r=write(sock,INFO_RESP,1);
if(r!=1)
{
fclose(fp);
return -6;
}
//IBcomlog_print(__FILE__,__LINE__,"write resp");
r=fwrite(str,len,1,fp);
if(r<0)
{
fclose(fp);
return -7;
}
if(last)
break;
}
fclose(fp);
return 0;
}//文件发送函数
int IBsndfile(int sock,char *sndfile)
{
int r,len,last=0;
char info[2],slen[5];
#ifndef MAXSTRINGLEN
#define MAXSTRINGLEN 128
#endif
#ifndef INFO_NORMAL
#define INFO_NORMAL "N"
#endif
#ifndef INFO_END
#define INFO_END "E"
#endif
#ifndef INFO_RESP
#define INFO_RESP "R"
#endif
char str[MAXSTRINGLEN],cmd[128];
FILE *fp;
memset(str,0,MAXSTRINGLEN);
fp=fopen(sndfile,"r");
if(fp==NULL)
{
return -1;
}
while(1)
{
memset(str, 0, MAXSTRINGLEN);
memset(slen, 0, sizeof(slen));
//IBcomlog_print(__FILE__,__LINE__,"fread ");
r=fread(str,MAXSTRINGLEN,1,fp);
if(r<0)
{
fclose(fp);
return -6;
}
len=strlen(str);
if(len<MAXSTRINGLEN||feof(fp))
last=1;
//IBcomlog_print(__FILE__,__LINE__,"write info ");
if(last)
{
r=write(sock,INFO_END,1);
//IBcomlog_print(__FILE__,__LINE__,"write info end");
}
else
{
r=write(sock,INFO_NORMAL,1);
//IBcomlog_print(__FILE__,__LINE__,"write info normal");
}
if(r!=1)
{
fclose(fp);
return -2;
}
sprintf(slen,"%4d",len);
r=write(sock,slen,4);
//IBcomlog_print(__FILE__,__LINE__,"write slen [%s] r=%d",slen,r);
if(r!=4)
{
fclose(fp);
return -4;
}
//IBcomlog_print(__FILE__,__LINE__,"write buf[%s] ",str);
r=write(sock,str,len);
if(len!=r)
{
fclose(fp);
return -5;
}
r=read(sock,info,1);
//IBcomlog_print(__FILE__,__LINE__,"read resp [%c] r=%d",info[0],r);
if(r!=1)
{
fclose(fp);
return -6;
}
if(strncmp(info,INFO_RESP,1))
{
fclose(fp);
return -7;
}
if(last)
break;
}
fclose(fp);
return 0;
}
int IBrcvfile(int sock,char *rcvfile)
{
int r,len,last=0;
char info[2],slen[5];
#ifndef MAXSTRINGLEN
#define MAXSTRINGLEN 128
#endif
#ifndef INFO_NORMAL
#define INFO_NORMAL "N"
#endif
#ifndef INFO_END
#define INFO_END "E"
#endif
#ifndef INFO_RESP
#define INFO_RESP "R"
#endif
char str[MAXSTRINGLEN],cmd[128];
FILE *fp;
memset(str,0,MAXSTRINGLEN);
fp=fopen(rcvfile,"w+");
if(fp==NULL)
{
return -1;
}
while(1)
{
memset(str, 0, MAXSTRINGLEN);
memset(slen, 0, sizeof(slen));
//IBcomlog_print(__FILE__,__LINE__,"read info");
r=read(sock,info,1);
if(r<0)
{
fclose(fp);
return -2;
}
//IBcomlog_print(__FILE__,__LINE__,"read info[%s]",info);
if(strncmp(info,INFO_END,1)!=0&&strncmp(info,INFO_NORMAL,1)!=0)
{
fclose(fp);
return -3;
}
if(!strncmp(info,INFO_END,1))
last=1;
r=read(sock,slen,4);
//IBcomlog_print(__FILE__,__LINE__,"read slen=[%s]",slen);
if(r!=4)
{
fclose(fp);
return -4;
}
len=atoi(slen);
r=read(sock,str,len);
//IBcomlog_print(__FILE__,__LINE__,"read buf[%s] r=%d",str,r);
if(r!=len)
{
fclose(fp);
return -5;
}
//IBcomlog_print(__FILE__,__LINE__,"write resp");
r=write(sock,INFO_RESP,1);
if(r!=1)
{
fclose(fp);
return -6;
}
//IBcomlog_print(__FILE__,__LINE__,"write resp");
r=fwrite(str,len,1,fp);
if(r<0)
{
fclose(fp);
return -7;
}
if(last)
break;
}
fclose(fp);
return 0;
}//文件发送函数
int IBsndfile(int sock,char *sndfile)
{
int r,len,last=0;
char info[2],slen[5];
#ifndef MAXSTRINGLEN
#define MAXSTRINGLEN 128
#endif
#ifndef INFO_NORMAL
#define INFO_NORMAL "N"
#endif
#ifndef INFO_END
#define INFO_END "E"
#endif
#ifndef INFO_RESP
#define INFO_RESP "R"
#endif
char str[MAXSTRINGLEN],cmd[128];
FILE *fp;
memset(str,0,MAXSTRINGLEN);
fp=fopen(sndfile,"r");
if(fp==NULL)
{
return -1;
}
while(1)
{
memset(str, 0, MAXSTRINGLEN);
memset(slen, 0, sizeof(slen));
//IBcomlog_print(__FILE__,__LINE__,"fread ");
r=fread(str,MAXSTRINGLEN,1,fp);
if(r<0)
{
fclose(fp);
return -6;
}
len=strlen(str);
if(len<MAXSTRINGLEN||feof(fp))
last=1;
//IBcomlog_print(__FILE__,__LINE__,"write info ");
if(last)
{
r=write(sock,INFO_END,1);
//IBcomlog_print(__FILE__,__LINE__,"write info end");
}
else
{
r=write(sock,INFO_NORMAL,1);
//IBcomlog_print(__FILE__,__LINE__,"write info normal");
}
if(r!=1)
{
fclose(fp);
return -2;
}
sprintf(slen,"%4d",len);
r=write(sock,slen,4);
//IBcomlog_print(__FILE__,__LINE__,"write slen [%s] r=%d",slen,r);
if(r!=4)
{
fclose(fp);
return -4;
}
//IBcomlog_print(__FILE__,__LINE__,"write buf[%s] ",str);
r=write(sock,str,len);
if(len!=r)
{
fclose(fp);
return -5;
}
r=read(sock,info,1);
//IBcomlog_print(__FILE__,__LINE__,"read resp [%c] r=%d",info[0],r);
if(r!=1)
{
fclose(fp);
return -6;
}
if(strncmp(info,INFO_RESP,1))
{
fclose(fp);
return -7;
}
if(last)
break;
}
fclose(fp);
return 0;
}
解决方案 »
- [召集贴]打造CSDN史上最强群星闪耀贴
- 请问在delphi的循环语句里,用什么命令跳出来循环语句?
- DHTMLEDIT发布的问题
- 关于hook的问题,解决200分全给!
- 请高人帮忙!!!
- Delphi7中的一些问题
- 怎样做有字母加数字的客户编号?
- 如何在DBGrid表格控件中为记录添加色带,即第一个记录为黄色,第二个记录为白色,第三个记录为黄色,第四个记录为白色,依次类推,此问题我已经查找了大量的资料但始终未能解决,请帮助我
- 好的安装程序有哪些!请介绍几个.........
- 两个问题,问了很多人都没解决
- 已经一个的ProcID,如何判断是个进程是否已经关闭
- 自己写的Socks5代理的源码,还有些问题没有解决,请大家指教!(3)
sock应该是端口号吧,sndfile就是你要传送的文件了。
好像不对,我原来也是这么想的,传参数用了ClientSocket1.Socket.Handle,实际上函数返回-2,请再帮忙看一下,谢谢!
ClientSocket要使用阻塞方式。。