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

疑问,send函数出现illegal seek错误,但是发送接收完全正确。(有代码)
这是一段简单的用TCP发送文件的程序。客户端接收到的数据完全正确,通过抓包也没什么问题,但是在发送端send函数会出现illegal seek错误,检查了几遍也没检查出原因,请大家帮忙看看。
int main(char argc,char **argv)
{
struct stat fileStat1;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
int sock_tcp;
int sock_accept;
int fd_file1;
int sock_flag;
int len;
int count;
int send_len;
int size;
int i,j;
char buff1[20000];
// char file_buff1[100000];
unsigned char *file_buff1;

memset(&fileStat1,0,sizeof(fileStat1));
memset(&my_addr,0,sizeof(my_addr));
memset(&remote_addr,0,sizeof(remote_addr));
memset(buff1,0,20000);

my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(10000);
inet_aton("192.168.0.171",&my_addr.sin_addr);

remote_addr.sin_family=AF_INET;
// remote_addr.sin_port=htons(10000);
// inet_aton("192.168.0.56",&remote_addr.sin_addr);

if((sock_tcp=socket(AF_INET,SOCK_STREAM,0))<0)
perror("socket tcp");

sock_flag=1;
if(setsockopt(sock_tcp,SOL_SOCKET,SO_REUSEADDR,&sock_flag,sizeof(sock_flag))<0)
perror("setsockopt");
if(bind(sock_tcp,(struct sockaddr *)&my_addr,sizeof(my_addr))<0)
perror("bind");

if(listen(sock_tcp,10)<0)
perror("listen");

if((sock_accept=accept(sock_tcp,(struct sockaddr *)&remote_addr,&len))<0)
perror("accept");

printf("Server: a connection build\n");

if(stat("ap1",&fileStat1)<0)
perror("stat");

file_buff1=malloc(fileStat1.st_size);
if((fd_file1=open("ap1",O_RDWR))<0)
perror("open");

read(fd_file1,file_buff1,fileStat1.st_size);
close(fd_file1);

len=fileStat1.st_size;
printf("the length of file=%d\n",len);

send_len=0;

count=0;
while(len>1460)
{
if(send(sock_accept,&file_buff1[send_len],MAX_TCP_BYTES,0))
{
printf("%d\n",count);
perror("send");
}
len-=1460;
send_len+=1460;
count++;
}

if(send(sock_accept,&buff1[send_len],len,0)) //每次send都要出现 illegal seek的错误
perror("send"); 

close(sock_accept);
close(sock_tcp);
free(file_buff1);
return 0;
}


------解决方案--------------------
send_len=0 ; ? 初始化的问题?


------解决方案--------------------
文件 ap1 有多大...
------解决方案--------------------
探讨
第一次send返回success,之后的send无论发送什么都返回illegal seek,但是接收方接收到的数据是完全正确的