前回の記事では、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 の設定
最近、仕事中に問題が発生しました。Docker コンテナがホストの redis にアクセスできず、t...
1. データのバックアップ1. mysqldumpコマンドを使用してバックアップするmysqldum...
パスワード強度検証について: [root@mysql mysql]# mysql -uroot -p...
MySQL 開発チームは、2019 年 10 月 14 日に MySQL 8.0.18 GA バージ...
仕事上、携帯電話に適応した Web ページ効果を作成する必要があります。ようやく完成しました。まずは...
インターネット上の this.$set の説明はわかりにくいと感じます。単一データ、オブジェクト、配...
Gitlab と Github の違いについては、あまり説明する必要はありません。一言でまとめると、...
目次charとvarcharの違いcharとvarcharの違い上記は、MySQL における cha...
PS: 最近、nginx を詳細に紹介している <<High-Performance ...
適応型レイアウトは、実際のアプリケーションでますます一般的になっています。今日は、主にフローティング...
構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...
Dockerイメージ内のファイルを表示する方法1. すでに実行中の場合すでに実行中のイメージについて...
前面に書かれたLinux を使用する際にソフトウェアをインストールする必要がある場合があります。もち...
この記事では、JavaScriptシミュレーション計算機の具体的なコードを参考までに紹介します。具体...
1. まず本文にulタグを追加します <!-- 順序なしリスト --> <ul i...