以下是两个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;
}

解决方案 »

  1.   

    function IBsndfile(sock:integer, sndfile:pchar):integer;far; external 'dll文件名';
    sock应该是端口号吧,sndfile就是你要传送的文件了。
      

  2.   

    补充一下,那个sock应该是创建的SOCKET句柄。
      

  3.   

    TO:shilinqun(群群) 
    好像不对,我原来也是这么想的,传参数用了ClientSocket1.Socket.Handle,实际上函数返回-2,请再帮忙看一下,谢谢!
      

  4.   

    ,我可以把DLL发过去,请各位大侠帮忙写一个Delphi调用此动态库传送文件的例子,谢谢!
      

  5.   

    连接已建立,关键问题应该是函数的第一个参数sock的含义,到底对应Delphi的什么参数?
      

  6.   

    那段C代码太简陋了,只适合于阻塞方式,
    ClientSocket要使用阻塞方式。。
      

  7.   

    这段代码是银行给的,我要做文件接收程序,银行方面的程序可能UNIX下的C程序,所以还得考虑用这段代码。
      

  8.   

    你把ClientSocket改为使用阻塞方式,就是那个clienttype用ctblocking。。你那个handle值是负数好象不对吧
      

  9.   

    不是Handle是负数,是IBsndfile、IBrcvfile函数的返回值是-2。