当前位置: 技术问答>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循环里,当文件接受完毕后就被阻塞了。
哪位大哥能帮我看看这个问题该如何解决啊?
由于代码有点多,我就直接描述一下吧,程序的流程如下:
第一步:客户端请求连接服务器,并用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这个函数应该返回
当文件发送完毕之后,服务端会发一个报告给客户端。
现在问题是,由于服务端不知道文件已经发送完了,所以它一直在recv,而客户端知道了文件已发送完毕,于是进入等待服务端报告的流程,就是也进入recv,这样两边不都阻塞了吗?
你必须要找一个方法让服务器知道文件发送完毕啊。
还有,你的这句话:
如果客户端文件已经发送完了的话,那么客户端就会调用recv函数来接受服务器端的响应, 此时服务器端的recv这个函数应该返回