当前位置:  技术问答>linux和unix

socket阻塞了,急急急.....

    来源: 互联网  发布时间:2017-02-06

    本文导语:  我用socket写了一个上传文件的程序,可是不知什么原因,客户端和服务器端都一直阻塞在recv函数那里,哪位高手能帮忙看看是什么原因吗?  由于代码有点多,我就直接描述一下吧,程序的流程如下: 第一步:客户...

我用socket写了一个上传文件的程序,可是不知什么原因,客户端和服务器端都一直阻塞在recv函数那里,哪位高手能帮忙看看是什么原因吗? 

由于代码有点多,我就直接描述一下吧,程序的流程如下:
第一步:客户端请求连接服务器,并用send函数想服务器发送要上传文件的文件名,然后调用recv函数读取服务器的响应信息
第二步:服务器使用recv函数从socket中读取第一步中客户端上传的文件名,然后决定是否同意接受文件,如果同意接受,就用send函数向客户端发送数字0, 并调用循环调用recv函数从socket中读取客户端上传的文件信息。
第三步:客户端收到服务器的响应,如果是数字0,就循环调用send函数把文件读出来并发送出去, 文件发送完之后立即调用recv函数接收服务器端的响应信息。并关闭客户端的socket。代码如下:
while ((len = fread(buf, 1, 1024, fd)) > 0)
{
    send(client_fd, buf, len, 0);
}
fclose(fd);
recv(client_fd, buffer, 1024, 0);
printf("%sn", buffer);
close(client_fd);
return;

第四步:服务器循环调用recv函数从socket读取客户端传送的文件信息。文件读取完毕之后,对文件进行加密处理,如果加密成功就调用send函数向客户端响应数字0,否则响应-1。

上面的第一步和第2步都可以正常执行,问题就出在第三步和第四步上,第三步中客户端被阻塞在recv函数那里, 第四步中服务器在从socket中循环读取文件时被阻塞了,读取文件的代码如下:
while ((len = recv(sockfd, buf, 1024, 0)) > 0)
{
  fwrite(buf, 1, len, fd);
}
fclose(fd);
我打印了一下信息,在while循环里,当文件接受完毕后就被阻塞了。


哪位大哥能帮我看看这个问题该如何解决啊?




|
大概看了一下你的逻辑,没怎么看懂,我理解是:
当文件发送完毕之后,服务端会发一个报告给客户端。

现在问题是,由于服务端不知道文件已经发送完了,所以它一直在recv,而客户端知道了文件已发送完毕,于是进入等待服务端报告的流程,就是也进入recv,这样两边不都阻塞了吗?

你必须要找一个方法让服务器知道文件发送完毕啊。

还有,你的这句话:
如果客户端文件已经发送完了的话,那么客户端就会调用recv函数来接受服务器端的响应, 此时服务器端的recv这个函数应该返回

    
 
 

您可能感兴趣的文章:

  • linux 如何用SOCKET设置函数设置阻塞和非阻塞?
  • 非阻塞SOCKET,竟然也会阻塞?
  • 初级问题,socket(AF_INET, SOCK_STREAM, 0)是阻塞式还是非阻塞式?
  • 关于socket编程中阻塞的问题
  • linux C socke编程 创建的socket默认是阻塞的还是非阻塞的?
  • linux socket fd 写阻塞问题
  • socket编程,关于connect阻塞问题
  • 非阻塞socket该如何使用。。。
  • 当进程处于socket读阻塞模式中,外部SIGNAL发生,此时信号相应响应函数可否进行socket写?
  • select和非阻塞socket的迷惑
  • linux下socket的send函数阻塞问题?
  • solaris socket 非阻塞recv产生 EBADF 错误
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 非阻塞的socket的问题
  • socket编程,设为非阻塞,客户端怎么判断connect已经成功呢?
  • 昨天发现fcntl设置非阻塞SOCKET会频繁的失败,不知道什么原因.
  • socket 非阻塞 出错
  • 一个socket阻塞问题 ,请多多指教!!!(只剩下100分了)
  • 急问:怎么判断一个非阻塞的socket已经断开了?
  • linux下如何设置一个socket为非阻塞方式?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3