sockatmark() — ソケットがアウト・オブ・バンドのマークにあるかどうか判別

標準

標準/拡張機能 C/C++ 依存項目

Single UNIX Specification、バージョン 3

両方 z/OS® V1R9

形式

SUSV3:
#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 を設定します。

エラー・コード
説明
EBADF
s 引数は、有効なファイル記述子ではありません。
ENOTTY
s 引数は、ソケットの記述子を指定していません。

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);
   }
}

関連情報