標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
Single UNIX Specification、バージョン 3 |
両方 | z/OS® V1R9 |
#define _POSIX_C_SOURCE 200112L
#include <sys/socket.h>
int sockatmark(int s);
sockatmark() 関数は、記述子 s で指定されたソケットがアウト・オブ・バンドのデータ・マークにあるかどうか判別します。ソケット用のプロトコルが、アウト・オブ・バンドのデータ・マークでストリームをマーク付けすることによってアウト・オブ・バンドのデータをサポートしている場合、sockatmark() 関数は、マークに先行するすべてのデータが読み込まれ、アウト・オブ・バンドのデータ・マークが受信キューの最初のエレメントの場合、1 を戻します。sockatmark() 関数は、ストリームからマークを除去しません。
引数 | 説明 |
---|---|
s | ソケットがアウト・オブ・バンドのデータ・マークにあるかどうか判別するのに使用される記述子。 |
正常に実行された場合、sockatmark() 関数はソケットがアウト・オブ・バンドのデータ・マークにあるかどうかを示す値を戻します。プロトコルがデータ・ストリームをマーク付けして、マークに先行するすべてのデータが読み込まれた場合、戻り値は 1 になります。マークが無い場合、あるいはデータが受信キューのマークに先行する場合、sockatmark() 関数は 0 を戻します。その他の場合、戻り値は -1 となり、エラーを示す errno を設定します。
CELEBS74
⁄* CELEBS74
This example demonstrates the use of the sockatmark() function.
Expected output:
C: Sending regular data
C: Sending OOB data
S: Received "123a"
S: At the mark
S: Received "b"
*⁄
#define _POSIX_C_SOURCE 200112L
#include <sys⁄socket.h>
#include <netinet⁄in.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv) {
struct sockaddr_in saddr;
socklen_t addr_len = sizeof(saddr);
int port = 12121, n, ld, connfd, servfd;
char buffer[25];
pid_t pid;
if((ld = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("socket error¥n");
return 0;
}
saddr.sin_family = AF_INET;
saddr.sin_port = 12121;
if(bind(ld,(struct sockaddr *)&saddr,addr_len) == -1){
printf("bind error¥n");
return 0;
}
if(listen(ld,5) == -1){
printf("listen error¥n");
return 0;
}
pid = fork();
if(pid==0){
if((connfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("socket error¥n");
exit(0);
}
if(connect(connfd,(struct sockaddr *)&saddr,addr_len) == -1){
printf("connect error¥n");
exit(0);
}
printf("C: Sending regular data¥n");
send(connfd,"123",3,0);
printf("C: Sending OOB data¥n");
send(connfd,"ab",2,MSG_OOB);
close(connfd);
exit(0);
}
else {
servfd = accept(ld,(struct sockaddr *)&saddr,&addr_len);
if(servfd == -1) {
printf("accept error¥n");
exit(0);
}
sleep(5);
memset(buffer,0,sizeof(buffer));
recv(servfd,&buffer,sizeof(buffer),0);
printf("S: Received ¥"%s¥"¥n",buffer);
memset(buffer,0,sizeof(buffer));
n = sockatmark(servfd);
if(n == 1) printf("S: At the mark¥n");
recv(servfd,&buffer,sizeof(buffer),MSG_OOB);
printf("S: Received ¥"%s¥"¥n",buffer);
close(servfd);
close(ld);
}
}