UNIX下的C函数移植到Windows2000下,谢谢帮助!
抱朴守拙 2005-01-05 03:48:05 http://community.csdn.net/Expert/topic/3700/3700725.xml?temp=.8901026
以下是两个UNIX下的c函数,分别实现发送及接收文件,参数sock为端口号,我不知道这段函数在Windows2000系统下能不能直接用?如果不能,该怎么做才能改成widnows下能用的?请大侠帮忙,先谢谢大家了!!问题解决后,再送上100分。
//文件接收函数
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;
}