- 论坛徽章:
- 0
|
sorry, 刚刚没发完,接上:
sock = socket(pres->ai_family, pres->ai_socktype, pres->ai_protocol);
if (sock == -1) {
trace4(LVL_ERROR, LOGARG, "socket() failed(%d).", errno);
ret = AC_ERROR_SOCK;
goto exit;
}
if (pres->ai_family== AF_INET) {
inet_pton(AF_INET, mydev, &(other_ip.s6_addr32[3]));
memset(&socketaddr, 0, sizeof(struct sockaddr_in));
socketaddr.sin_family = AF_INET;
memcpy(&(socketaddr.sin_addr), &(other_ip.s6_addr32[3]), sizeof(struct sockaddr_in));
socketaddr.sin_port = htons(0);
ret = bind( sock, (struct sockaddr*)&socketaddr, sizeof(struct sockaddr_in));
}
else {
inet_pton(AF_INET6, mydev, &(other_ip.s6_addr32));
memset(&socketaddr6, 0, sizeof(struct sockaddr_in6));
socketaddr6.sin6_family = AF_INET6;
socketaddr6.sin6_flowinfo = 0;
socketaddr6.sin6_port = htons(0);
memcpy(&(socketaddr6.sin6_addr),&other_ip, sizeof(struct in6_addr));
ret = bind( sock, (struct sockaddr*) &socketaddr6, sizeof(struct sockaddr_in6));
}
if (ret != 0) {
trace4(LVL_ERROR, LOGARG, "bind() failed(%d).", errno);
ret = AC_ERROR_SOCK;
goto exit;
}
if(flag == USE_SHM)
{
listin_sockets(*ppsockets);
}
/* connect */
/*modify for control connect time by zhaoyh on 20070305*/
blockFlag = fcntl(sock, F_GETFL);
blockFlag |= O_NONBLOCK;
fcntl( sock, F_SETFL, blockFlag);
ret = connect(sock, pres->ai_addr, pres->ai_addrlen);
if (ret == -1) {
FD_ZERO(&fd);
FD_SET(sock, &fd);
timeout.tv_sec = _aclinfo.tout;
timeout.tv_usec =0;
ret = select(sock + 1, NULL, &fd, NULL, &timeout);
if(ret > 0)
{
if(FD_ISSET(sock, &fd) == 0)
{
trace4(LVL_ERROR, LOGARG, "socket<%d> is not in fd !", sock, errno);
ret = AC_ERROR_NOTCONN;
}
else
{
ret = 0;
}
}
else if(ret ==0)
{
trace4(LVL_ERROR, LOGARG, "select(%d,...) timeout.", sock);
ret = AC_ERROR_NOTCONN;
}
else
{
trace4(LVL_ERROR, LOGARG, "select(%d,...) failed,errno<%d>.", sock, errno);
ret = AC_ERROR_NOTCONN;
}
if(ret == 0)
{
/*clear noblock I/0*/
blockFlag = fcntl(sock, F_GETFL);
blockFlag = blockFlag & ~O_NONBLOCK;
fcntl( sock, F_SETFL, blockFlag );
}
else
{
goto exit;
}
}
else {
/*clear noblock I/0*/
blockFlag = fcntl(sock, F_GETFL);
blockFlag = blockFlag & ~O_NONBLOCK;
fcntl( sock, F_SETFL, blockFlag );
} |
|