jni socket 连接异常的问题

jiangpingzhan 2011-04-09 01:49:32
程序第一次运行能正常连接到服务器. 并能进行数据传输 . 发命令到服务器请求断开连接 .并关闭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;
}
...全文
308 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbwhzfl 2012-06-11
  • 打赏
  • 举报
回复
为什么我的socket创建都失败了呢,参数和你的是一样的
llw87 2012-02-07
  • 打赏
  • 举报
回复
result = select(sk.socket+1,NULL,&writefds,NULL,&tv);
select调用后writefds的内容会被改变,所以只能够连接成功一次,在建一个fd_set变量fds,
fds = writefds,然后result = select(sk.socket+1,NULL,&fds,NULL,&tv);
jiangpingzhan 2011-08-08
  • 打赏
  • 举报
回复
//
bool REUSEADDR = true;
setsockopt(msg_videosocket.cmdsk,SOL_SOCKET,SO_REUSEADDR,&REUSEADDR,sizeof(bool));

//
struct linger linger;
linger.l_onoff = 1;
linger.l_linger = 0;
setsockopt(msg_videosocket.cmdsk,SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger));

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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