C言語のaccept関数の用法を教えてください。

C言語のaccept()関数はサーバ側でクライアントからの接続要求を受け付けるために使用されます。この関数のプロトタイプは次のようになります。

#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

パラメータの説明:

  1. sockfd: リスニングソケットの記述子
  2. addr:クライアントのアドレス情報を格納する「sockaddr」構造体へのポインタ
  3. addrlen:addr構造体のサイズを表す。受け取るときは構造体の実際のサイズに設定する必要があり、リクエストを受け取るとその値が更新されます。

accept()関数は次のように機能します。

  1. サーバはソケット関数を呼び出してソケットを作成して初期化しています。
  2. サーバーはbind関数を呼び出してソケットを特定のローカルアドレス、通常はサーバーのIPアドレスとポート番号にバインドします。
  3. サーバーは listen 関数を実行してソケットを待受状態にして、クライアントからの接続要求を待つ。
  4. サーバはクライアントから接続リクエストがあると、accept関数を呼び出してリクエストを受け付ける。この関数は、接続リクエストが来るまでプログラムの実行をブロックする。
  5. アクセプト関数は新しいソケットを作成し、クライアントのソケットに接続します。この新しいソケットの記述子を返します。
  6. サーバーは、戻された新しいソケットを使用してクライアントと通信できます。

以下のコード例をご覧ください。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd, newsockfd, portno, clilen;
struct sockaddr_in serv_addr, cli_addr;
// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
exit(1);
}
// 初始化服务器地址结构
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 1234;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
// 绑定套接字
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
exit(1);
}
// 开始监听
listen(sockfd, 5);
clilen = sizeof(cli_addr);
// 接受连接请求
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
perror("ERROR on accept");
exit(1);
}
// 连接建立成功,可以使用newsockfd与客户端进行通信
return 0;
}

このコードでは、サーバは 1234 番ポートで接続要求をリッスンし、クライアントが接続すると、 accept 関数は新しいソケット記述子 newsockfd を返します。サーバは newsockfd を使用してクライアントと通信できます。

bannerAds