socket connect 函数使用的问题

anranlei 2011-09-27 04:28:45
int ret = connect(m_SocketClient, (struct sockaddr *) &addr, sizeof(addr));
就是在连接过程中将网络接口down掉,ifconfig lo down(它连接的是本机)
程序会停在 int ret = connect(m_SocketClient, (struct sockaddr *) &addr, sizeof(addr)); 这段代码

怎么才能让它正常识别网络不通
...全文
124 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
anranlei 2011-09-29
  • 打赏
  • 举报
回复
弄完了
的确是这么回事的
督门提码 2011-09-28
  • 打赏
  • 举报
回复
http://blog.csdn.net/lspo816/article/details/663554 朋友这个好好看看
anranlei 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq120848369 的回复:]

本身是有超时的,可以用非阻塞connect加select判断超时,或者阻塞connect加alarm.
[/Quote]

具体描述一下说
非阻塞的那个是怎么弄?
qq120848369 2011-09-28
  • 打赏
  • 举报
回复
本身是有超时的,可以用非阻塞connect加select判断超时,或者阻塞connect加alarm.
qq120848369 2011-09-28
  • 打赏
  • 举报
回复
本身是有超时的,可以用非阻塞connect加select判断超时,或者阻塞connect加alarm.
anranlei 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bjtbjt 的回复:]

引用 2 楼 liu111qiang88 的回复:

可以通过返回值判断的 返回为0 代表成功了 返回 -1失败了 下边做相应的处理,或者通过GetLastError()获得错误信息。
错误代码
C/C++ code

EBADF 参数sockfd 非合法socket处理代码   EFAULT 参数serv_addr指针指向无法存取的内存空间   ENOTSOCK 参数sock……
[/Quote]

灰机灰过去了
anranlei 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jiangyiaxiu 的回复:]

if(ret!=0)
{
perror("connect error!");
exit(1);
}

要是网络不通报错为 connect error:Connection refused
[/Quote]
这个是我的代码

unsigned long hostaddr = inet_addr(hostname);
struct sockaddr_in sin;
//connection
*sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET;
sin.sin_port = htons(22);
sin.sin_addr.s_addr = hostaddr;
int ret = connect(*sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in));
printf("socket conn ret:%d\n", ret);
if(ret != 0){
return -1;//failed to connect
}
return 0;


它走不到printf()那句,就停在了connect那个函数那里,停的时间有点微长,至少两分钟还没有出来
督门提码 2011-09-28
  • 打赏
  • 举报
回复
http://apps.hi.baidu.com/share/detail/33798758

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket creat error");
return 1;
}

// 3.将socket建立为非阻塞,此时socket被设置为非阻塞模式
flags = fcntl(sockfd,F_GETFL,0);//获取建立的sockfd的当前状态(非阻塞)
fcntl(sockfd,F_SETFL,flags|O_NONBLOCK);//将当前sockfd设置为非阻塞
督门提码 2011-09-28
  • 打赏
  • 举报
回复
用以下方法将socket设置为非阻塞方式
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
用以下方法将socket设置为非阻塞方式
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
anranlei 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jiangyiaxiu 的回复:]

http://blog.csdn.net/lspo816/article/details/663554 朋友这个好好看看
[/Quote]

怎么是winsocket……
督门提码 2011-09-27
  • 打赏
  • 举报
回复
if(ret!=0)
{
perror("connect error!");
exit(1);
}

要是网络不通报错为 connect error:Connection refused
5t4rk 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liu111qiang88 的回复:]

可以通过返回值判断的 返回为0 代表成功了 返回 -1失败了 下边做相应的处理,或者通过GetLastError()获得错误信息。
错误代码
C/C++ code

EBADF 参数sockfd 非合法socket处理代码   EFAULT 参数serv_addr指针指向无法存取的内存空间   ENOTSOCK 参数sockfd为一文件描述词,非socket。   EISCONN 参……
[/Quote]

这是那来的
anranlei 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liu111qiang88 的回复:]

可以通过返回值判断的 返回为0 代表成功了 返回 -1失败了 下边做相应的处理,或者通过GetLastError()获得错误信息。
错误代码
C/C++ code

EBADF 参数sockfd 非合法socket处理代码   EFAULT 参数serv_addr指针指向无法存取的内存空间   ENOTSOCK 参数sockfd为一文件描述词,非socket。   EISCONN 参……
[/Quote]

这个是在哪里看的。。。。
anranlei 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luciferisnotsatan 的回复:]

有个超时时间的,能上一会应该会返回失败的。
[/Quote]

这个超时的时间能设置么?
我每30s连接一次结果
把interface禁用了后
第二次开始连接了上一次的还没有反应
于是又停在那连接了
也没有返回值
火头军 2011-09-27
  • 打赏
  • 举报
回复
可以通过返回值判断的 返回为0 代表成功了 返回 -1失败了 下边做相应的处理,或者通过GetLastError()获得错误信息。
错误代码

EBADF 参数sockfd 非合法socket处理代码   EFAULT 参数serv_addr指针指向无法存取的内存空间   ENOTSOCK 参数sockfd为一文件描述词,非socket。   EISCONN 参数sockfd的socket已是连线状态   ECONNREFUSED 连线要求被server端拒绝。   ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。   ENETUNREACH 无法传送数据包至指定的主机。   EAFNOSUPPORT sockaddr结构的sa_family不正确。   EALREADY socket为不可阻断且先前的连线操作还未完成。
luciferisnotsatan 2011-09-27
  • 打赏
  • 举报
回复
有个超时时间的,能上一会应该会返回失败的。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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