getsockopt()自写设置连接超时函数的问题, 急!

wzy9854 2013-06-18 03:39:06
int libnet_my_connect(int server_socket_ai, char *server_address_acp, int server_port_ai, int timeout_ai)
{
int ret;
struct sockaddr_in server_addr;
unsigned long ul = 1;
fd_set set;
int error=-1, len = 0;
struct timeval tm;

memset(&server_addr, '\0', sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons((u_short)server_port_ai);
server_addr.sin_addr.s_addr = inet_addr(server_address_acp);

/* set conn nonblock */
fcntl(server_socket_ai,F_SETFL, O_NONBLOCK);
ret = connect(server_socket_ai, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(ret == -1){
if(errno == EINPROGRESS){
/* if error = EINPROGRESS)*/
tm.tv_sec = timeout_ai;
tm.tv_usec = 0;
FD_ZERO(&set);
FD_SET(server_socket_ai, &set);
/* select for timeout */
if(select(server_socket_ai + 1, NULL, &set, NULL, &tm) > 0){
/* get socket errno */
getsockopt(server_socket_ai, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == 0){
/* conn pass */
ret = 1;
}else{
/* conn error */
perror("error!");
ret = 0;
}
}else{
/* conn error */
ret = 0;
}
}else
ret = 0;
}else
ret = 1;
ul = 0;
/* set block */
ioctl(server_socket_ai, FIONBIO, &ul);
if(ret == 0){
/* conn error */
fprintf(stderr , "Cannot Connect the server!\n");
return ret;
}

return ret;
}

如果函数中不加getsockopt()函数, 连接是可以进行数据收发的
但是增加getsockopt()函数后, getsockopt()函数会返回error = -1, 导致返回连接失败, 这样也就无法收发数据了
请各位大神看看代码那里有问题?
...全文
97 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2013-06-18
  • 打赏
  • 举报
回复
int error=-1, len = 0; getsockopt(server_socket_ai, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);

69,371

社区成员

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

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