Linux システムで TCP 接続を作成するプロセスの紹介

Linux システムで TCP 接続を作成するプロセスの紹介

LinuxでTCPを作成する手順

TCP プログラミングでは、クライアントとサーバー用に 2 セットのコードが必要であり、TCP を作成するプロセスは完全に一貫していません。

サーバ

ソケット関数を使用してソケットを作成する

ソケットプロパティを設定するには、setsockopt関数を使用します。

bind関数を使用してIPアドレスとポート情報をソケットにバインドし、listen関数を使用して指定されたポートをリッスンします。

accept関数を使用してクライアントの接続要求を受信する

送信/受信および読み取り/書き込み機能を使用してデータを送受信します

close関数を使用してネットワーク接続を閉じ、監視します

クライアント

socket関数を使用してソケットを作成し、setsockopt関数を使用してソケットのプロパティを設定します。

バインド機能を使用してIPアドレスとポート情報をバインドします

接続先のIPアドレスとポートを設定し、接続関数を使用して接続を要求します。

送信/受信および読み取り/書き込み機能を使用してデータを送受信します

close関数を使用してネットワーク接続を閉じる

TCP確立プロセス

Linux は TCP 接続プロセスを作成します_linux

サンプルコード

サーバ

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <文字列.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <time.h>
#定義 MAXSIZE 128

charニュース[MAXSIZE];
int res; //関数の戻り値を受け取るために使用 void* pthread_chat(void * arg) //データを受信するためのスレッドを作成する {
    int confd = *(int *)arg;
    ながら(1)
    {
        res = recv(confd, news, sizeof(news), 0);
        (解像度<= 0の場合)
        {
        perror("受信");
        壊す;
        }
        printf("ニュースは: %s\n",news);
        memset(ニュース,0,MAXSIZE);
        送信(confd,"OK",2,0);
    }

    printf("クライアントが1つ終了しました\n");
    confd を閉じます。
}

char *Time() //現在の時刻を取得する{
    time_t タイマー;
    構造体 tm *tブロック;
    タイマー = 時間(NULL);
    tblock = localtime(&timer);
    asctime(tblock) を返します。
}

void save(char *s) //ログファイルを保存する {
    整数データ;
    fd = open("ジャーナル",O_RDWR|O_APPEND|O_CREAT);

    もし(fd < 0)
        perror("開く");
    それ以外
    {
        char *buf = Time();
        strcat(バッファ,s);

        書き込み(fd,buf,MAXSIZE);
        lseek(fd,0,SEEK_END);

        (res < 0)の場合
            perror("書き込み");
    }
}

int メイン()
{
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    構造体 sockaddr_in saddr、caddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6666);
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    (res < 0)の場合
        perror("バインド");

    listen(sockfd, 5); //ポートをリッスンする while(1)
    {
        int len ​​= sizeof(caddr);
        int confd = accept(sockfd,(struct sockaddr*)&caddr, &len);
        if(confd < 0)
        {
            perror("受け入れる");
            続く;
        }それ以外
        {
            保存(inet_ntoa(caddr.sin_addr));
        }

        printf("confdis:%d、ip=%s\n を受け入れます",confd,inet_ntoa(caddr.sin_addr));

        pthread_t の tid です。
        pthread_create(&tid, NULL, pthread_chat, &confd);
    }
}

クライアント

#include <文字列.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>  
#定義 MAXSIZE 128

charニュース[MAXSIZE];
int res; //関数の戻り値を受け取るために使用 int main()
{
    printf("------チャットルームへようこそ-----\n");
    printf("終了する場合は、--bye--\nと入力してください");
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

    構造体 sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6666);
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    int confd = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(confd < 0)
        perror("接続");

    ながら(1)
    {
        printf("ニュースを入力してください\n");
        fgets(ニュース、MAXSIZE、stdin);

        if(strncmp(ニュース,"さようなら",3) == 0)
        {
            壊す;
        }

        送信(sockfd、ニュース、strlen(ニュース)、0);
        memset(ニュース,0,MAXSIZE);
        recv(sockfd, ニュース, sizeof(ニュース), 0);
          printf("サーバーのニュースは: %s\n",news);
    }

    閉じる(sockfd);
    終了(0);
}

サーバーはマルチスレッド開発を使用するため、コンパイル時に -lpthread オプションを追加する必要があることに注意してください。

プログラム実行効果は次のとおりです。

Linux は TCP 接続プロセスを作成します_ネットワーク通信_02

Linux システムで TCP 接続を作成するプロセスに関するこの記事はこれで終わりです。Linux で TCP 接続を作成する方法に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux で TCP 接続の最大数をテストする方法
  • Linux での TCP 接続タイムアウト問題の解決方法
  • Linux で TCP 接続を確認する 2 つのコマンド

<<:  フォント名に従ってフォントを呼び出すと、ブラウザに必要なフォントが表示されます。

>>:  SCSS スタイルのコードを 50% 削減する 14 の実践的な経験

推薦する

phpstudy から Linux への MySQL の移行に関するチュートリアル

プロジェクトの目的元のWindows環境でphpstudyを使用して構築されたMySQL 5.5.5...

JS でモバイルのインタラクティブ エクスペリエンスを向上させる方法

目次1. 即時フィードバック1.1 ボタンからの即時フィードバック1.2 継続的なフィードバック1....

JavaScript キャンバスは影付きのグラフィックとテキストを実装します

キャンバスを使用して、参照用の影付きのグラフィックとテキストを作成します。具体的な内容は次のとおりで...

Linux で Grafana をインストールし、InfluxDB モニタリングを追加する方法

Grafana をインストールします。公式 Web サイトでは、直接インストールできる Ubuntu...

MySQLクエリが遅い原因と解決策

クエリ速度が遅くなる理由は多数ありますが、最も一般的な理由は次のとおりです。 1. インデックスがな...

Vueコンポーネントは、写真やビデオをアップロードするためのサンプルコードをカプセル化します

まず依存関係をダウンロードします: cnpm i -S vue-uuid ali-oss画像フィール...

HTML コード内のスペースと空白行についての簡単な説明

HTML コード内の連続するスペースまたは空白行 (改行) はすべて 1 つのスペースとして表示され...

Linux の圧縮および解凍コマンドの紹介

目次一般的な圧縮形式: gz .bz2 .xz .zip一般的に使用されるアーカイブは圧縮を必要とす...

Vue バッチ更新 DOM 実装手順

目次シーン紹介深い応答性トリガーゲッターDep.targetを探すゲッターセッター要約するシーン紹介...

MySQL 8.0 ウィンドウ関数の紹介と概要

序文MySQL 8.0 より前は、Oracle、SQL SERVER、PostgreSQL などの他...

ウェブデザインにおけるキーワード設計手法の紹介

多くの場合、ホームページを作成するときに、Web ページ ヘッダー属性の設定を無視します。 Web ...

Linuxシステムの操作レベルの詳細な紹介

目次1. Linuxシステムの操作レベルの概要2. 実行レベルを確認する3. 現在のシステムの動作レ...

仮想マシンのLinux初心者がIPを設定し、ネットワークを再起動する

仮想マシンを初めて使用する方や、仮想マシンに Linux をインストールしたばかりの方は、システムが...

MySQL ビッグデータ クエリ最適化エクスペリエンスの共有 (推奨)

本格的な MySQL 最適化! MySQL のデータ量が少ない場合は最適化は不要です。データ量が多い...

docker+devpi を使用してローカル pypi ソースをビルドする方法

以前、開発で頻繁に pip ダウンロードを使用する必要がありました。pip ソースを国産ソースに変更...