jni socket 连接异常的问题

jiangpingzhan 2011-04-09 02:24:05
程序第一次运行能正常连接到服务器. 并能进行数据传输 . 发命令到服务器请求断开连接 .并关闭socket 后 . 重新连接服务器 . 运行到这段代码 result = select(sk.socket+1,NULL,&writefds,NULL,&tv); 这段代码. 返回0 . 重启模似器后. 第一次能正常运行 . 请大家指点.



sk.socket = socket(AF_INET,SOCK_STREAM,0);
if(sk.socket == SOCKET_ERROR)
{
return 0;
}
unsigned long ul = 1;
result = ioctl(sk.socket, FIONBIO, &ul); //设置为非阻塞模式
if(result==-1)
{
__android_log_print(ANDROID_LOG_ERROR,"Tag", " ioctl FIONBIO error mark :%d \n", result );
return 0;
}
int error;
result = connect(sk.socket,(struct sockaddr*)&m_DeviceAddr,sizeof(struct sockaddr));
if( result == -1 )
{
if (errno == EINPROGRESS)
{// it is in the connect process
struct timeval tv;
fd_set writefds;
tv.tv_sec = 30;
tv.tv_usec = 0;
FD_ZERO(&writefds);
FD_SET(sk.socket, &writefds);
result = select(sk.socket+1,NULL,&writefds,NULL,&tv);
__android_log_print(ANDROID_LOG_ERROR,"Tag", " select error :%d \n", result );
if(result>0)
{
int len = sizeof(int);
getsockopt(sk.socket, SOL_SOCKET, SO_ERROR, &error, &len);
if(error==0)
{
unsigned long ul = 0;
result = ioctl(sk.socket, FIONBIO, &ul);
if(result==-1)
{
return 0;
}
struct timeval timeout={3,0};//3s

result = setsockopt(sk.socket,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));
if(result>0||result<0)
{
return 0;
}

result = setsockopt(sk.socket,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
if(result>0||result<0)
{
return 0;
}
memset(buf,0,200);
result = ReceiveData(sk.socket,m_DeviceTypeInfo,64,20);
if( result == SOCKET_ERROR)
{
sk.socket = NULL;
return 0;
}
netprotrocolver = *((unsigned long*)m_DeviceTypeInfo+3);
return 1;
}
}
else
{
__android_log_print(ANDROID_LOG_ERROR,"Tag", " error :%d \n", errno );
}
}
else
{
return 0;
}
sk.socket = NULL;
}
return 0;
}
...全文
216 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangpingzhan 2011-08-08
  • 打赏
  • 举报
回复
端口复用的问题
mrdone 2011-07-28
  • 打赏
  • 举报
回复
sk.socket = socket(AF_INET,SOCK_STREAM,0);
我的在这一步就错了,返回-1
jiangpingzhan 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pathuang68 的回复:]
建议:
直接用Java实现的Socket吧,除非你有需要自己用C/C++实现,再用Java通过jni去调用这个C/C++实现的充分理由。在绝大部分情况下,这种理由并不存在。

Java中的socket,本身实际上也是用jni调用C/C++的socket实现的。
[/Quote]

服务器端的server socket 用的c 语言写. java 与 c socket通讯需要进行高低字节转换. 实际情况是服务器端的结构体很复杂. 转换太麻烦了.
pathuang68 2011-04-09
  • 打赏
  • 举报
回复
建议:
直接用Java实现的Socket吧,除非你有需要自己用C/C++实现,再用Java通过jni去调用这个C/C++实现的充分理由。在绝大部分情况下,这种理由并不存在。

Java中的socket,本身实际上也是用jni调用C/C++的socket实现的。

64,640

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧