비저항 socket 하위 클라이언트connect + select 간단 데모
5725 단어 필기
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define IPADDR "www.baidu.com"
#define PORT 80
int main()
{
struct addrinfo *res, hint;
fd_set rest, west;
int error;
socklen_t optlen = sizeof(error);
memset(&hint, 0, sizeof(hint));
hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_STREAM;
if (0 != getaddrinfo(IPADDR, NULL, &hint, &res)) {
goto err0;
}
int sock = socket(res->ai_family, res->ai_socktype, 0);
if (-1 == sock)
goto err1;
if(-1 == fcntl(sock, F_SETFL, fcntl(sock, F_GETFL) | O_NONBLOCK))
goto err2;
struct sockaddr_in addr;
memset(&addr, 0 , sizeof(addr));
addr.sin_family = res->ai_family;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr;
int ret = connect(sock, (struct sockaddr *)&addr, sizeof(addr));
printf("ret = %d,errno = %d
",ret,errno);
if (-1 == ret && EINPROGRESS != errno)
goto err2;
/* select */
FD_ZERO(&rest);
FD_ZERO(&west);
FD_SET(sock, &rest);
FD_SET(sock, &west);
struct timeval tempval;
tempval.tv_sec = 3;
tempval.tv_usec = 0;
int flag = select(sock+1, &rest, &west, NULL, &tempval);//
if(flag < 0)
{
printf("select error
");
goto err2;
}
else
{
/* */
/* , : , : , getsockopt
sock , 0 0 。
*/
if(!FD_ISSET(sock, &rest) && !FD_ISSET(sock, &west))
{
printf("connect no response
");
goto err2;
}
else if(FD_ISSET(sock, &rest) && FD_ISSET(sock, &west))
{
flag = getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &optlen);
if(flag == 0 && error == 0)
{
printf("connect success....
");
}
else
{
printf("connect error....
");
goto err2;
}
}
else if(!FD_ISSET(sock, &rest) && FD_ISSET(sock, &west))
{
printf("connect success....
");
}
else
{
printf("connect error....
");
goto err2;
}
}
close(sock);
freeaddrinfo(res);
return 0;
err2:
close(sock);
err1:
freeaddrinfo(res);
err0:
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
static 간단한 설명static 방법은 일반적으로 정적 방법이라고 부른다. 정적 방법은 어떠한 대상에 의존하지 않고 접근할 수 있기 때문에 정적 방법에 있어this는 없다. 왜냐하면 그 어떠한 대상에도 의존하지 않기 때문이다. 대상이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.