使用NDK开发阻塞式socket客户端程序,recv读取数据无法关闭socket问题的解决

来源:互联网 发布:linux vsftpd 怎么使用 编辑:程序博客网 时间:2024/06/15 07:27

因近期开发的项目需要使用ndk开发socket客户端程序。ndk开发的库一共写了四个函数,

下面给出android中对四个函数的定义:

public native int ConnectTo(String ip, int port);
public native int SendData(int socketconnect,byte[] databuff,int datalen);
public native int RecvData(int socketconnect,byte[] databuff,int datalen);
public native int closeConnect(int socketconnect);

其中,在cpp文件的实现中,RecvData函数使用的recv是阻塞式的,一直处于等待接收状态,直至有数据接收进来。

在android中,开启一个新的线程中对RecvData进行调用,然而,处于等待状态的RecvData在运行时,

调用closeConnect时竟然无法关闭连接。这个问题害的我查了两天,一开始以为是线程写的有问题。多次试验发现,只要在线程中不调用RecvData就可以正常关闭。

后来查了几次资料才发现,在cpp的函数实现中,closeConnect调用close(sd);之前需要调用shutdown(sd,2);这样,就可以正常关闭连接了。

0 0