网络编程总是阻塞

yutianzuijin yutianzuijin 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
大家好,求助一个问题。
正在写一个网络通信程序,逻辑很简单。服务器接收客户端传递的文件,对文件进行处理,然后返回一个处理结果给客户端。逻辑就是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;
}
...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
yutianzuijin
yutianzuijin 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
C++ 语言 65,214 成员 250,514 内容