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 イメージのプルとタグ操作 pull | tag

Fabric プロジェクトのソースコードを読み直してみたところ、Docker の部分でよくわからな...

Tomcat プロセスの CPU 使用率が高い場合の解決策

目次場合コンテキスト切り替えのオーバーヘッド?要約するCPU は多くの場合、システム パフォーマンス...

Dockerコンテナ監視の原理とcAdvisorのインストールおよび使用方法

本番環境におけるコンテナの稼働状況を監視することは非常に重要です。監視を通じて、コンテナの稼働状況を...

HTMLページのネイティブVIDEOタグはダウンロードボタン機能を隠します

Web プロジェクトを作成しているときに、紹介ビデオが別にある紹介ページに遭遇しました。この短いビデ...

Robots.txtの詳細な紹介

robots.txt の基本的な紹介Robots.txt はプレーンテキスト ファイルであり、Web...

VMware Tools を最初からインストールするための詳細な手順 (グラフィック チュートリアル)

VMware Tools は VMware 仮想マシンに付属するツールで、VirtualBox (...

html ページ!--[IE の場合]...![endif]--使用方法の詳細な紹介

コードをコピーコードは次のとおりです。 <!--[IEの場合]><script t...

BootStrap グリッド間に隙間を残す解決策

目次[例を見る]: 【本来の効果は以下の通り】理由は次のとおりです。 【解決】:要約するBootSt...

マウスを動かしたときにセカンダリメニューバーを実装するために HTML+CSS を使用する例

この記事では、マウスを動かしたときにセカンダリ メニュー バーを実装するために HTML+CSS を...

Docker ベースの GitLab 環境をデプロイする方法と手順

注意:仮想マシンのメモリは2G以上が推奨され、 Alibaba Cloudのアクセラレーションイメー...

MySQLの基本操作学習ノートテーブル

テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...

uniappのグローバル変数実装の詳細な説明

序文この記事では、uniapp グローバル変数の実装方法をいくつかまとめています。詳細な知識は、uV...

CentOS に Redis と MySQL をインストールする

1|0MySQL(MariaDB) 1|11. 説明MariaDB データベース管理システムは My...

Dockerを使用してJenkinsをインストールする方法

目次1. イメージをプルする2. ローカルデータボリュームを作成する3. コンテナを作成する4. J...

角度コンテンツ投影の詳細な説明

目次単一コンテンツ投影マルチコンテンツ投影単一条件のコンテンツ投影アプリ-人物-htmlアプリ担当者...