日期:2014-05-16  浏览次数:20601 次

socket传送文件,丢失数据???
我写的socket程序,实现两主机间文件的传输,但不论是传输文本文件还是二进制文件在文件的最后都要丢失一两k的数据
这是服务接口:
[code=C/C++][/#include"unp.h"
extern char current_path[100];

int cmd_pic(int sock,int sockmsg)
{
printf("1\n");//debug
FILE *fd;
char buff[MAXSIZE];
size_t read_bytes;
char file_name[100];

bzero(buff,MAXSIZE);
bzero(file_name,100);

if( recv(sockmsg,file_name,100,0) == -1 )
err_sys("recv error");
strcat(current_path,"/");
strcat(current_path,file_name);
printf("debug:%s\n",current_path);//debug

if(( fd = fopen(current_path,"rb")) == NULL )
err_sys("fopen error");
while(( read_bytes = fread(buff,sizeof(char),MAXSIZE/sizeof(char),fd)) != 0 )
{
if(send(sock,buff,read_bytes,0) == -1 )
err_sys("send error");
bzero(buff,MAXSIZE);
}
if(ferror(fd))
{
printf("fread error\n");
exit(1);
}
return(0);
}]
这是客服接口:



[code=C/C++][/#include"unp.h"

int client_cmd_pic(int sock,int sockmsg)
{
char file_name[100];
char buff[1024];
ssize_t n;
FILE *fd;

bzero(file_name,100);
bzero(buff,1024);

if( send(sockmsg,"get",3,0) == -1 )
err_sys("cmd send error");
printf("input the file name\n");
scanf("%s",file_name);
if( send(sockmsg,file_name,strlen(file_name),0) == -1 )
err_sys("file_name send error");
if(chdir("/home/hexiaogang/Desktop") == -1 )
err_sys("chdir error");

if(( fd = fopen("kk","ab")) == NULL )
{
printf("fopen error\n");
exit(1);
}
while(( n = recv(sock,buff,1024,0)) != 0 )
{
if(n == -1 && errno == EINTR )
continue;
if( n == -1 )
err_sys("recv error");
fwrite(buff,sizeof(char),n/sizeof(char),fd);
}
fflush(fd);
fclose(fd);
return(0);
}
]

------解决方案--------------------
噢,那就用setsockopt设置SO_LINGER选项然后close掉套接口,具体可以参看UNP第七章