前回の記事では、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 の設定
幅と高さを直接使用することはできません。 display:block; または display:in...
目次テーマを動的に変更する最初の方法: 動的コンポーネント2番目の方法はルーティング分離です要約する...
WEB アプリケーションのページでは、テーブルがよく使用されます。列の数が限られているため、各列のコ...
CSSスタイルとHTMLタグ要素を使用するさまざまな HTML タグに点線の境界線を追加するために、...
ページをナビゲートする2つの方法宣言型ナビゲーション: リンクをクリックしてナビゲーションを実現する...
環境準備:複数のコンテナに基づいてホストに lnmp をデプロイします。 nginx サービス: 1...
目次1. コンポーネント化とは何ですか? 2. 基本的な使い方序文:場合によっては、HTML 構造化...
前のこれは古くからある古典的な質問です。以前読者から質問があったので、ここでお答えします。簡単な例か...
仮想マシンの IP アドレスを変更します。 次のインターフェイスに入り、サブネット IP を直接変更...
シナリオの説明あるシステムでは、機能サービスはdocker stack deploy xxxで起動し...
序文前回の記事では、eコマース シナリオでのフラッシュ セールの例を通じて、モノリシック アーキテク...
この記事では、Windows 10環境でのMySQL 5.5のインストールと使用方法を紹介します。リ...
1. 背景通常、外部サービスを提供する必要がある Docker コンテナの場合、起動時に -p コマ...
序文MySQL をインストールすると、通常はスーパーユーザー root を作成します。多くの人がこの...
具体的なコードは次のとおりです。 HTMLコードは次のとおりです <div class=&qu...