网络编程,接收不到数据

Tang0jie 2011-08-06 11:09:34
刚开始学网络编程,写了个小程序测试了一下,老是第一次接收不到数据,但是就是能接收到结束标志,郁闷。
一小段代码如下:

服务端: while(1)
{
printf("abc\n");
bzero(buffer2,sizeof(buffer2));
n=read(pthread->clientsocket,buffer2,sizeof(buffer2));
printf("read=%d\n",n);
printf("%s\n",buffer2);
if(strcmp(buffer2,"quit")==0)
break;

fwrite(buffer2,n,1,fp);

}
printf("recv over\n");
fclose(fp);


客服端:
fd=open(mp.filename,O_RDWR);
if(fd==-1)
{
perror("open file error!");
exit(1);
}
lseek(fd,0,SEEK_SET);
bzero(buffer,sizeof(buffer));
while((n=read(fd,buffer,sizeof(buffer)))>0)
{
m=write(socket2,buffer,strlen(buffer));
printf("write=%d\n",m);
printf("%s\n",buffer);
sleep(1);
bzero(buffer,sizeof(buffer));
}
close(fd);
bzero(buffer,sizeof(buffer));
strcpy(buffer,"quit");
sleep(1);
write(socket2,buffer,strlen(buffer));
printf("%s\n",buffer);
printf("update file over!\n");


客服端终端信息如下:
Update Files:b.c //输入文件,打印如下
write=11
123456
789

quit
update file over!


服务端终端信息如下:
abc
read=4
quit
recv over //每次客服端输入文件名,服务端就只打印这四句。


求高手指正一下!
...全文
100 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tang0jie 2011-08-07
  • 打赏
  • 举报
回复
准备把代码传上去之前又整理优化一下代码,之后发现可行了,好像是
while(1)
{
printf("abc\n";
bzero(buffer2,sizeof(buffer2));
n=read(pthread->clientsocket,buffer2,sizeof(buffer2));
printf("read=%d\n",n);
printf("%s\n",buffer2);
if(strcmp(buffer2,"quit"==0)
break;

fwrite(buffer2,n,1,fp);

}
在read接收之前有一个recv接收的没接收完此次send发送的数据长度(我把send的发送数据长度不小心设置大了),read一开始就接收上一次余留下来的,照理在循环那里会不停的接收的,难道第二次发送的“quit”把前面的文件内容冲掉了,看来对那个发送和接收缓冲区原理认识不够。
Tang0jie 2011-08-06
  • 打赏
  • 举报
回复
对,是阻塞式的socket,在打印abc之后它就阻塞等待,但是客服端循环结束后我又发送了了一次退出字符串“quit”,这时服务器端就可以接收到“quit”并退出了。就是不知道为什么把文件里面的东西发过去后服务器端就接收不了。
开始领悟 2011-08-06
  • 打赏
  • 举报
回复
是否是阻塞式的socket,是不是阻塞在那个地方了,跟踪一下
Tang0jie 2011-08-06
  • 打赏
  • 举报
回复
我这个是文件传输程序的一小部分,代码有一定的量,不太容易贴全,主要用到线程池,条件变量,服务端的操作是放到线程函数里面的,线程函数中有关这一部分的贴出来看看能起到作用不

void *processthread(void *para)
{
int index=*((int *)para);
char buffer[1024];
char buffer1[1024];
int n,count,i;
int fd;
int num=0;
int size;
FILE *fp;
char path[100];
char buffer2[1024];

char buffer3[1024];
char *temp;

char temp1[1024];
char temp2[1024];
char *temp3;
DIR *dir;
struct dirent *ptr;
int flag=0;

struct threadatom *pthread=&threadpoolatom[index];


printf("pthread\n");

tap: pthread_mutex_lock(&pthreadMutex);
pthread_cond_wait(&pthreadCond,&pthreadMutex);
pthread_mutex_unlock(&pthreadMutex);
//---------------------------------
bzero(temp1,sizeof(temp1));
sleep(1);
recv(pthread->clientsocket,temp1,sizeof(temp1),0);
printf("%s\n",temp1);
chdir(userbuffer);
// printf("%s\n",buffer2);
// sleep(1);
dir=opendir(userbuffer);
if(dir==NULL)
{
perror("fail to open dir");
exit(1);
}

while((ptr=readdir(dir))!=NULL)
{

if(strcmp(temp1,ptr->d_name)==0)
{
flag=1;
break;
}

}
if(flag==0)
{
mkdir(temp1,0774);
printf("create dir\n");
}

if(chdir(temp1)<0)
printf("change dir error!\n");
//////////serverlist
getcwd(temp2,sizeof(temp2));
//printf("%s\n",temp2);
temp3=serverlist();
//printf("%s\n",temp3);
send(pthread->clientsocket,temp3,1024,0);

//----------------------------------

while(1)
{

bzero(buffer,sizeof(buffer));


recv(pthread->clientsocket,buffer,sizeof(buffer),0);
//printf("%s\n",buffer);
///////////////////////////////////
if(strcmp(buffer,"1")==0)
{


struct statfs fs;
//printf("recv pMp\n");
bzero(buffer,sizeof(buffer));
bzero(path,sizeof(path));

recv(pthread->clientsocket,buffer,sizeof(buffer),0);
struct threadfile *pMp=(struct threadfile *)buffer;


fp=fopen(pMp->filename,"w+");
if(fp==NULL)
{
fclose(fp);
exit(1);
}

while(1)
{
printf("abc\n");
bzero(buffer2,sizeof(buffer2));
n=read(pthread->clientsocket,buffer2,sizeof(buffer2));
printf("read=%d\n",n);
printf("%s\n",buffer2);
if(strcmp(buffer2,"quit")==0)
break;

fwrite(buffer2,n,1,fp);
/* if(strcmp(buffer2," ")==0
break;*/

}
printf("recv over\n");
fclose(fp);

谭海燕 2011-08-06
  • 打赏
  • 举报
回复
你把代码贴全。主要看你的socket还有读写操作
Tang0jie 2011-08-06
  • 打赏
  • 举报
回复
我不停的测试,有时候能接收到文件里发过来的东西,但这种几率很小,试了N次才有一次能接收到。
louyong0571 2011-08-06
  • 打赏
  • 举报
回复
上gdb调试,呵呵

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧