网络编程总是阻塞
大家好,求助一个问题。
正在写一个网络通信程序,逻辑很简单。服务器接收客户端传递的文件,对文件进行处理,然后返回一个处理结果给客户端。逻辑就是client:send--->server:recv,server:process,server:send--->client:recv。就是这么一个简单的逻辑,不知道为什么代码总是在server接收完文件之后阻塞,阻塞的地方还是server端的recv函数。但是这时客户端已经发送完整个文件,send调用完毕,开始调用recv等待服务器处理的结果。搞了好久也没有搞明白是怎么回事,希望能有人解答一下。
客户端关键代码:
服务器端核心代码为:
正在写一个网络通信程序,逻辑很简单。服务器接收客户端传递的文件,对文件进行处理,然后返回一个处理结果给客户端。逻辑就是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;
}
...全文
相关推荐
java网络编程(非阻塞与阻塞编程)
在深入探讨Java网络编程中的非阻塞与阻塞编程之前,我们先来了解这两个概念的基本含义。
网络编程 套接字 无阻塞
总结起来,网络编程中的套接字和无阻塞模式结合多线程技术,能有效地处理并发的TCP连接,提供高效、稳定的通信环境。
链接:用于非阻塞网络编程的Clojure框架
在IT领域,网络编程是构建分布式系统、Web服务和实时数据处理的关键部分。非阻塞网络编程是一种高效的编程模式,特别适用于高并发场景,因为它避免了线程的频繁上下文切换,从而减少了资源消耗。
[转载] 多线程阻塞式网络编程socket_源代码
在IT领域,网络编程是构建分布式系统的基础,而Socket编程是网络编程的核心部分。本文将深入探讨标题和描述中提到的“多线程阻塞式网络编程socket”相关的知识点。
java网络编程socket非阻塞通信
通过java网络编程深入理解socket阻塞通信和非阻塞通信的在网络中的应用源码包每一行都有注释,在代码里面每一个类都有详细的注释来解释这个类的功能这个方法的功能,调用哪一个类的哪一个功能等等。压缩包


