前回の記事では、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 の設定
問題の説明:構造:テストには2つのフィールドがあります。これらは col1 と col2 で、どちら...
データベース MySQL バージョン 8.0.18 DBeaver.exeをダウンロードするダウンロ...
具体的な方法: 1. コマンドプロンプトを開く2. mysql -u root -pコマンドを入力し...
2.1 セマンティクス化により、Webページが検索エンジンに理解されやすくなりますこの章では、We...
昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...
reactプロジェクトで非常に一般的なシナリオ: const [watchValue、setWatc...
目次序文XA プロトコルMySQL XA で分散トランザクションを実装する方法序文MySQL が単一...
この記事では、Linux環境でのmysql5.6.24自動インストールスクリプトコードを参考までに共...
これまでの記事で、フロントエンド開発者にとって必須のツール、スクリプト、リソースのコレクションを紹介...
スレッドが同時に実行される場合、スレッドがリソースを競合してデータの曖昧さが生じるのを防ぐために、重...
最近Nginxを構築しているのですが、ドメイン名でアクセスできません。 nginx 構成ファイル n...
主な違いは次のとおりです。 1. MySQL はデフォルトで MyISAM を使用します。 2. M...
まずmysqlの圧縮バージョンをダウンロードします。公式ダウンロードアドレスは123WORDPRES...
コンテナの自動起動Docker は、コンテナが終了したとき、または Docker が再起動されたとき...