-
Notifications
You must be signed in to change notification settings - Fork 7
sockatmark(3)
sockatmark - 소켓이 대역외 표시에 있는지 알아보기
#include <sys/socket.h>
int sockatmark(int sockfd);
glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):
-
sockatmark()
: _POSIX_C_SOURCE >= 200112L
sockatmark()
는 파일 디스크립터 sockfd
가 가리키는 소켓이 대역외 표시에 위치해 있는지 여부를 나타내는 값을 반환한다. 소켓이 그 표시에 있으면 1을 반환한다. 소켓이 그 표시에 있지 않으면 0을 반환한다. 이 함수가 대역외 표시를 제거하지는 않는다.
성공적인 sockatmark()
호출은 소켓이 대역외 표시에 있으면 1을 반환하고 아니면 0을 반환한다. 오류 시 -1을 반환하며 오류를 나타내도록 errno
를 설정한다.
EBADF
-
sockfd
가 유효한 파일 디스크립터가 아니다. EINVAL
-
sockfd
가sockatmark()
를 적용할 수 있는 파일 디스크립터가 아니다.
glibc 버전 2.2.4에서 sockatmark()
가 추가되었다.
이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.
인터페이스 | 속성 | 값 |
---|---|---|
sockatmark() |
스레드 안전성 | MT-Safe |
POSIX.1-2001, POSIX.1-2008.
sockatmark()
가 1을 반환하는 경우에는 recv(2)의 MSG_OOB
플래그를 사용해 대역외 데이터를 읽을 수 있다.
일부 스트림 소켓 프로토콜들에서만 대역외 데이터를 지원한다.
SIGURG
시그널 핸들러에서 안전하게 sockatmark()
를 호출할 수 있다.
sockatmark()
는 SIOCATMARK
ioctl(2)
동작을 이용해 구현되어 있다.
glibc 2.4 전에서는 sockatmark()
가 제대로 동작하지 않았다.
다음 코드를 SIGURG
시그널 수신 후에 사용해서 표시까지의 모든 데이터를 읽어들인 (그리고 폐기한) 다음 표시에 있는 데이터 바이트를 읽을 수 있다.
char buf[BUF_LEN];
char oobdata;
int atmark, s;
for (;;) {
atmark = sockatmark(sockfd);
if (atmark == -1) {
perror("sockatmark");
break;
}
if (atmark)
break;
s = read(sockfd, buf, BUF_LEN);
if (s == -1)
perror("read");
if (s <= 0)
break;
}
if (atmark == 1) {
if (recv(sockfd, &oobdata, 1, MSG_OOB) == -1) {
perror("recv");
...
}
}
fcntl(2), recv(2), send(2), tcp(7)
2017-09-15