Linux でタイムアウト付きの接続関数を試す

Linux でタイムアウト付きの接続関数を試す

前回の記事では、Windows でタイムアウトを試してみました。この記事では、Linux で試してみます。インタビューでこの質問に出会ったのですが、興味深いですね。

クライアントコード上で直接:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <文字列.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <time.h>
int main(int argc, char *argv[]) // 入力パラメータに注意し、IPとポートを指定します
{
  int sockClient = socket(AF_INET, SOCK_STREAM, 0);
  構造体 sockaddr_in addrSrv;
  inet_addr は inet_addr の引数に argv[1] を代入します。
  addrSrv.sin_family = AF_INET;
  addrSrv.sin_port = htons(atoi(argv[2]));
 fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0)|O_NONBLOCK); 
  int iRet = connect(sockClient、(const struct sockaddr *)&addrSrv、sizeof(struct sockaddr_in));
 printf("connect iRet is %d, errmsg:%s\n", iRet, strerror(errno)); // (iRet != 0) の場合、-1 を返すことは必ずしも例外ではありません 
 { 
   (errno != EINPROGRESS)の場合
 {
  printf("接続エラー:%s\n", strerror(errno)); 
 }
   それ以外 
 {
  構造体timevaltm = {5, 0}; 
  fd_set wset、rset; 
  FD_ZERO(&wset); 
  FD_ZERO(&rset); 
  FD_SET(sockClient, &wset); 
  FD_SET(sockClient, &rset); 
  整数時間1 = 時間(NULL);
  int n = select(sockClient + 1, &rset, &wset, NULL, &tm); 
  整数time2 = time(NULL);
  printf("時間差は%d\n", time2 - time1);
  (n < 0)の場合 
  { 
   printf("選択エラー、nは%dです\n", n); 
  } 
  そうでない場合(n == 0) 
  { 
   printf("接続タイムアウト\n"); 
  } 
  そうでない場合 (n == 1) 
  {
   FD_ISSET(sockClient, &wset)の場合 
   { 
    printf("接続成功!\n"); 
    fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0) & ~O_NONBLOCK); 
   } 
   それ以外 
   { 
    printf("不明なエラー:%s\n", strerror(errno)); 
   } 
  }
  それ以外
  {
  printf("ああ、今は気にしないで、n は %d\n です", n);
  }
 } 
 } 
 printf("私はここにいます!\n");
  getchar();
  sockClient を閉じます。
  0を返します。
}

サーバーのコードは何度も書いているので、この記事では書きません。

テスト後、上記のプログラムは正常です。また、SYN パケットの再送信、RST パケットなどのパケットを tcpdump を使用してキャプチャすることで、多くのことを学ぶことができます。かなり興味深いですね。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Linux の fsevents モジュールによって発生する npm ls エラーの解決方法の詳細な説明
  • Linux 上での Go 環境の構築のインストールと設定の説明
  • Linux の cut コマンドの使用法の概要
  • Linuxシステムの入出力管理とvimの共通機能の詳細な説明
  • Linux シェル - 識別によってファイル システム属性をテストする方法の例
  • Linux シェルにおける if のさまざまな判断
  • Linux シェルの pushd、popd、dirs の使用方法の説明
  • Linux シェル コンソールでさまざまな色のフォントと背景を印刷する方法
  • Linux で so または実行可能プログラムの依存ライブラリを表示します
  • Linuxのアラーム機能の例の説明

<<:  Vue での親子コンポーネント通信と、sync を使用して親子コンポーネント データを同期する

>>:  Mac での MySQL と Squel Pro の設定

推薦する

Dockerコンテナがホストポートにアクセスできない場合の解決策

最近、仕事中に問題が発生しました。Docker コンテナがホストの redis にアクセスできず、t...

MySQL データのバックアップと復元のサンプル コード

1. データのバックアップ1. mysqldumpコマンドを使用してバックアップするmysqldum...

MySQL はパスワード強度の検証をオフにします

パスワード強度検証について: [root@mysql mysql]# mysql -uroot -p...

MySQL 8.0 の新機能: ハッシュ結合

MySQL 開発チームは、2019 年 10 月 14 日に MySQL 8.0.18 GA バージ...

モバイル適応型ウェブページ効果は、小さな表示ページの問題を解決します

仕事上、携帯電話に適応した Web ページ効果を作成する必要があります。ようやく完成しました。まずは...

Vue での this.$set の動的データバインディングのケーススタディ

インターネット上の this.$set の説明はわかりにくいと感じます。単一データ、オブジェクト、配...

CentOS8.1 で Gitlab サーバーを構築するための詳細なチュートリアル

Gitlab と Github の違いについては、あまり説明する必要はありません。一言でまとめると、...

面接官がmysqlのcharとvarcharの違いを尋ねたとき

目次charとvarcharの違いcharとvarcharの違い上記は、MySQL における cha...

中国語でのNginx設定パラメータの詳細な説明(負荷分散とリバースプロキシ)

PS: 最近、nginx を詳細に紹介している <<High-Performance ...

適応レイアウトの処理について(フロートとマージンネガティブマージンを使用)

適応型レイアウトは、実際のアプリケーションでますます一般的になっています。今日は、主にフローティング...

セマンティックウェブページ XHTML セマンティックマークアップ

構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...

Dockerイメージ内のファイルを表示する方法

Dockerイメージ内のファイルを表示する方法1. すでに実行中の場合すでに実行中のイメージについて...

Linux で rpm パッケージを見つけるために CD をマウントする方法

前面に書かれたLinux を使用する際にソフトウェアをインストールする必要がある場合があります。もち...

JavaScript シミュレーション計算機

この記事では、JavaScriptシミュレーション計算機の具体的なコードを参考までに紹介します。具体...

js は丸で囲まれた数字のリストのサンプルコードを動的に追加します

1. まず本文にulタグを追加します <!-- 順序なしリスト --> <ul i...