前回の記事では、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 をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。 以下もご興味があるかもしれません:
|
<<: Vue での親子コンポーネント通信と、sync を使用して親子コンポーネント データを同期する
>>: Mac での MySQL と Squel Pro の設定
Fabric プロジェクトのソースコードを読み直してみたところ、Docker の部分でよくわからな...
目次場合コンテキスト切り替えのオーバーヘッド?要約するCPU は多くの場合、システム パフォーマンス...
本番環境におけるコンテナの稼働状況を監視することは非常に重要です。監視を通じて、コンテナの稼働状況を...
Web プロジェクトを作成しているときに、紹介ビデオが別にある紹介ページに遭遇しました。この短いビデ...
robots.txt の基本的な紹介Robots.txt はプレーンテキスト ファイルであり、Web...
VMware Tools は VMware 仮想マシンに付属するツールで、VirtualBox (...
コードをコピーコードは次のとおりです。 <!--[IEの場合]><script t...
目次[例を見る]: 【本来の効果は以下の通り】理由は次のとおりです。 【解決】:要約するBootSt...
この記事では、マウスを動かしたときにセカンダリ メニュー バーを実装するために HTML+CSS を...
注意:仮想マシンのメモリは2G以上が推奨され、 Alibaba Cloudのアクセラレーションイメー...
テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...
序文この記事では、uniapp グローバル変数の実装方法をいくつかまとめています。詳細な知識は、uV...
1|0MySQL(MariaDB) 1|11. 説明MariaDB データベース管理システムは My...
目次1. イメージをプルする2. ローカルデータボリュームを作成する3. コンテナを作成する4. J...
目次単一コンテンツ投影マルチコンテンツ投影単一条件のコンテンツ投影アプリ-人物-htmlアプリ担当者...