Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> LinuxでのTCPサーバとクライアントの実装チュートリアル

LinuxでのTCPサーバとクライアントの実装チュートリアル

  

まずプログラムのTCPサーバ側を見てください。
#include< stdlib.h> #include< stdio.h> #include< errno.h> #include<; string.h> #include< netdb.h> #include< sys /types.h> #include< netinet /in.h> #include< sys /socket.h> #define portnumber 3333 //サーバーのポート番号とクライアントのポート番号は等しくなければなりません。
int main(int argc、char * argv []){int sockfd、new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size; int nbytes; char buffer [1024]; /*サーバー側は、sockfd記述子の構築を開始する*(if(sockfd = socket(AF_INET、SOCK_STREAM、0))== - 1)//AF_INET:IPV4; SOCK_STREAM:TCP {fprintf(stderr、")ソケットエラー:%s \\ n \\ a"、strerror(errno)); exit(1);} /*サーバーサイドのフィルsockaddr構造体* /bzero(& server_addr、sizeof(struct sockaddr_in)); //初期化、設定0server_addr.sin_family = AF_INET; //Internetserver_addr.sin_addr.s_addr = htonl(INADDR_ANY); //(このマシンになります)長いデータはネットワーク上の長いデータに変換されます)。//ホスト通信//INADDR_ANYはすべてのIPアドレスのデータを受信できることを意味します、つまりすべてのIPserver_addr.sin_port = htons(portnumber); //(このマシンでは短くなります)データはネットワーク上で短いデータに変換されます。)ポート番号/* sockfd記述子をIPアドレスにバンドル* /if(bind(sockfd、(struct sockaddr *)(& server_addr)、sizeof(struct sockaddr))== - 1) {fprintf(stderr、 "バインドエラー:%s \\ n \\ a"、strerror(errno)); exit(1);} /*接続を許可されるクライアントの最大数を設定します* /if(listen(sockfd、5)= = -1){fprintf(stderr、"リスンエラー:%s \\ n \\ a"、strerror(errno)); exit(1);} while(1){/*クライアントが接続を確立するまでサーバーはブロックされます* /sin_size = sizeof(struct sockaddr_in); if((new_fd = accept(sockfd、(struct sockaddr *)(& client_addr)、& sin_size))== - 1){fprintf(stderr、"エラーを許可:% s \\ n \\ a "、strerror(errno)); exit(1);} fprintf(stderr、"サーバは%sから接続を取得\\ n "、inet_ntoa(client_addr.sin_addr)); //ネットワークアドレスを次のように変換します。 。 String if((nbytes = read(new_fd、buffer、1024))== - 1)//これは、((nbytes = recv(new_fd、buffer、1024,0))== - 1)のように書くことができます。関数fprintf(stderrに、"読み取りエラー:%S \\ n",はstrerror(errnoに));出口(1);} [nバイト] = '\\ 0' バッファとのprintf(" Serverは;,%S \\ N"バッファを受け/*この通信は終了しました* /close(new_fd); /* Loop next * /} /*通信を終了します* /close(sockfd); exit(0);} クライアントのプログラムを確認します。 BR>の#include< STDLIB.H>の#include< stdio.hの>の#include< ERRNO.H>の#include< string.hの>の#include< netdb.h>の#include< SYS /タイプ。 H>の#include< netinetの/in.h>の#include< SYS /socket.hに>の#defineポート番号3333intメイン(int型ARGC、CHAR * ARGV []){int型数sockfd; char型バッファ[1024];構造体のsockaddr_in SERVER_ADDR;構造体たhostent *ホスト; /*使用ホスト名のクエリホスト名* /IF(ARGC = 2!){関数fprintf(stderrに、"使用:\\ \\%sのホスト名N",のargv [0]);出口(1);}もし、((ホスト=のgethostbyname(ARGV [1]))== NULL){関数fprintf(stderrに、"のgethostnameエラー\\ n");出口(1);} /TCP {fprintfの(stderrに、"ソケットエラー:%sの、SOCK_STREAMインターネット://AF_INET - *クライアントが数sockfdディスクリプタ* /IF(1(数sockfd =ソケット(AF_INET、SOCK_STREAM、0))==)を確立するために開始されます\\ \\ N",はstrerror(errnoに));出口(1);} /*クライアント充填サーバ情報* /BZERO(&#038; SERVER_ADDR、はsizeof(SERVER_ADDR)); //初期化カウンタ0server_addr.sin_family = AF_INET; //IPV4server_addr.sin_port = htons(ポート番号); //ポート番号server_addr.sin_addr(ネットワーク上の短いデータにこのマシン上で短いデータ)= *((構造体in_addr形式*)宿主 - > h_addr)。接続エラー; {fprintfの(stderrに、" -; //IPアドレス/*クライアントが接続要求* /(1 SERVER_ADDR)、はsizeof(sockaddr構造体))==(接続数sockfd、(sockaddr構造体の*)(&#038)場合を開始します:%S \\ \\ N",はstrerror(errnoに));出口(1);} /*接続が成功する* /のprintf("を入力してくださいチャー:\\ N"); /*データを送信する* /関数fgets(バッファ、1024、STDIN)は、書き込み(数sockfd、バッファ、strlenを(バッファ)); //ここで送信(数sockfd、バッファ、strlenを(バッファ)のように書くことができ、0); /*エンド通信* /クローズ(数sockfd)。終了(0);} 実行シーケンスの結果は:(注を次のようにソケットソケットクライアントとサーバが使用してtcp_serverコンパイラhi3515 gccのtcp_server.c -o上の別のサーバー仮想マシンクライアント上にあるように思わアームhismall- Linux-gcc tcp_client.c -o tcp_hiclientでプログラムをコンパイルします。サーバー:
クライアント:

Copyright © Windowsの知識 All Rights Reserved