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 の実践的な経験

推薦する

JS で単一ファイルコンポーネントを実装する方法

目次概要単一ファイルコンポーネント基本概念シンプルなローダーコンポーネントコンテンツの解析コンポーネ...

MySQLのインデックス選択と最適化の詳細な説明

目次インデックスモデルB+ツリーインデックスの選択インデックスの最適化インデックスの選択性カバーイン...

mysqldump を使用して MySQL データをバックアップする方法

1. mysqldump の紹介mysqldump は、MySQL に付属する論理バックアップ ツー...

Alibaba Cloud CentOS 7 に yum を使用して MySQL をインストールする正しい方法 (推奨)

yum クイックインストール mysql yumリポジトリを追加する rpm -Uvh http:...

MySQL 時間統計方法の概要

データベースの統計を行う場合、多くの場合、年、月、日に基づいてデータを収集し、echart を使用し...

JavaScript メッセージ ボックスの例

JavaScript では、警告ボックス、確認ボックス、プロンプト ボックスの 3 種類のメッセージ...

MySQL データベースのバックアップをスケジュールするいくつかの方法 (包括的)

目次1. データをバックアップするためのmysqldumpコマンド2. 一般的なmysqldump操...

MySQLテーブルのテーブル構造を素早く変更する方法

MySQL テーブルのテーブル構造をすばやく変更する - 「MySQL 管理」から抜粋 ALTER ...

Vue スキャフォールディング プロジェクトを作成するための詳細な手順

vue スキャフォールディング -> vue.cli大規模で完全に機能する Vue プロジェク...

Ubuntu 18.04 のログインループ/ブートインターフェイスで停止/グラフィカルインターフェイスに入ることができない問題を解決する方法

原因: NVIDIA グラフィック カード ドライバーが破損している解決:コマンドラインモードで再起...

MySQL 8.0 のタイムゾーン問題を解決する手順

ソフトウェアバージョンウィンドウズ: ウィンドウズ10 MySQL: mysql-8.0.16-wi...

ワンクリックで雨や雪のエフェクトを実現する ThingJS パーティクルエフェクト

目次1. パーティクルエフェクト2. シーンを読み込む3. さまざまな粒子効果の実現エンディング: ...

MySQLデータベースのトランザクション分離レベルの詳細な説明

データベーストランザクション分離レベルデータベース トランザクションには、低から高まで 4 つの分離...

MySQLの左結合と内部結合について簡単に説明します

序文最近、X 省のコールド チェーン トレーサビリティ システムの開発で忙しくしています。毎日午後 ...

Docker プライマリ ネットワーク ポート マッピング構成

ポートマッピングDocker コンテナを起動する前にポート マッピングを行わないと、コンテナ外部のネ...