网络编程总是阻塞

yutianzuijin
博客专家认证
2014-04-17 05:46:41
大家好,求助一个问题。
正在写一个网络通信程序,逻辑很简单。服务器接收客户端传递的文件,对文件进行处理,然后返回一个处理结果给客户端。逻辑就是client:send--->server:recv,server:process,server:send--->client:recv。就是这么一个简单的逻辑,不知道为什么代码总是在server接收完文件之后阻塞,阻塞的地方还是server端的recv函数。但是这时客户端已经发送完整个文件,send调用完毕,开始调用recv等待服务器处理的结果。搞了好久也没有搞明白是怎么回事,希望能有人解答一下。
客户端关键代码:

result=connect(sockfd,(struct sockaddr*)&address,len);
if(result==-1)
{
perror("connect failed!");
close(sockfd);
exit(-1);
}

FILE* fp=fopen(name,"rb");
if(fp==NULL)
{
perror("open file failed");
close(sockfd);
exit(-1);
}

send_file(buffer,sockfd,fp);//自定义发送文件函数,调用send

recv(sockfd,returned_id,sizeof(returned_id),0);


服务器端核心代码为:
 
{
...

if(recv_file(path,sockfd)==-1)
{
perror("receive file failed");
close(sockfd);
pthread_exit(NULL);
}

//process the received file

send(sockfd,result,10,0);

...
}

int recv_file(char* path,int client_sockfd)
{
FILE* fp;
int read_length;
char buffer[1024];

fp=fopen(path,"wb");
if(fp==NULL)
{
perror("Open file failed");
return -1;
}

while((read_length=recv(client_sockfd,buffer,1023,0))>0)//阻塞的位置
{
client_sockfd, read_length);
buffer[read_length]='\0';
fwrite(buffer,1,read_length,fp);
}

fclose(fp);

printf("write to file %s\n",path);

return 0;
}
...全文
183 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-04-18
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
不要做咸鱼 2014-04-18
  • 打赏
  • 举报
回复
服务端怎么知道你文件发送完毕啊,肯定是你来控制,简单的办法是客户端发送文件大小,然后服务端判断是否接收完文件,接收完成之后调用send函数。
yutianzuijin 2014-04-18
  • 打赏
  • 举报
回复
引用 1 楼 sd530842780 的回复:
服务端怎么知道你文件发送完毕啊,肯定是你来控制,简单的办法是客户端发送文件大小,然后服务端判断是否接收完文件,接收完成之后调用send函数。
现在明白阻塞是正常的行为,因为我就是用的阻塞函数。解决方案有二:最简单的还是采用阻塞函数,但是就像你说的首先传递一个长度,然后判断是否传递结束;或者将传递改为非阻塞函数,这个可能比较麻烦,代码改动很多,尚未尝试。

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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