見出し画像

【C言語】サーバーとクライアントのプロセス間通信(TCP/IP)のプログラムを作成してみた。


こんにちは、tangoです。
今回なんですが、サーバーとクライアントのプロセス間通信のプログラムを作成したので、それの紹介をしたいと思います。
まだ、C言語を勉強してそんなに経っていないので、C言語のプロからすると無茶苦茶なコードかもしれないですが、その時はご教授して頂ければ幸いです。

★サーバーとクライアントのプロセス間通信

1.ディレクトリの中身を確認して、client.cserver.c をコンパイルしていきます。

コマンド(ディレクトリ配下を参照)
dir

画像1


コマンド(コンパイル)

<クライアント側>
gcc -lwsock32 client.c -lws2_32 -o client

<サーバー側>
gcc -lwsock32 server.c -lws2_32 -o server

画像2


2.対象ディレクトリの中に、コンパイルされたclient.exeserver.exe が存在するか確認します。
もし、作成されていなかったらセキュリティがかかっている可能性がありますので、【Windows版】コマンドプロンプトでC言語をコンパイルしてみたの『ウイルス対策ソフトの無効化』を参考にしてみてください。

画像3


3.client.exeserver.exe を起動さします。

画像4

画像5


4.起動さしたら、クライアント側のコマンドプロンプトに文字を打ち、Enterを押します。
すると、サーバー側のコマンドプロンプトにクライアント側で打った文字が反映されます。

画像6


以上が、サーバーとクライアントのプロセス間通信する流れになります。


★ソースコード

次にソースコードの紹介です。

クライアント側のソースコード

# include<stdio.h>
# include<winsock2.h>

int main(){
   WSADATA w;
   char buf[500], output[500];
   struct sockaddr_in server;
   WSAStartup(MAKEWORD(2,0), &w);
   
   for(;;){
   //ソケット生成
   int sock = socket(AF_INET, SOCK_STREAM, 0);
   
   //接続先サーバ
   server.sin_addr.s_addr = inet_addr("127.0.0.1");
   server.sin_port = htons(9999);
   server.sin_family = AF_INET;
   
   //接続
   connect(sock, (struct sockaddr *)&server, sizeof(server));
   
   //送信データ
   scanf("%s", buf);
   sscanf(buf, "%s", output); 
   
   //送信
   send(sock, buf, sizeof(buf), 0);
   
   //ソケットを閉じる
   closesocket(sock);
   }
   
   WSACleanup();
   return 0;
}


サーバー側のソースコード

# include<stdio.h>
# include<winsock2.h>

int main(){
   WSADATA w;
   WSAStartup(MAKEWORD(2,0), &w);
   char buf[500];
   struct sockaddr_in server, client;
   
   int sock = socket(AF_INET, SOCK_STREAM, 0);
   
   server.sin_addr.s_addr = INADDR_ANY;
   server.sin_port = htons(9999);
   server.sin_family = AF_INET;
   
   //ソケット登録
   bind(sock, (struct sockaddr *)&server, sizeof(server));
   
   //ソケットの接続準備
   listen(sock, 1);
   
   for(;;){
   //ソケット接続待機
   int len = sizeof(client);
   int sock2 = accept(sock, (struct sockaddr *)&client, &len);
   
   //データ受信
   //recv(sock2, buf, sizeof(buf), MSG_PEEK);
   recv(sock2, buf, sizeof(buf), 0);
   printf("%s\n", buf);
   closesocket(sock2);
   }
   closesocket(sock);
   
   WSACleanup();
   return 0;
}


これから、C言語についてもっと学びたいので、他にも作品を作っていきたいと思います。
その都度、ご指摘して頂ければ幸いです。
また、C言語の詳しい方と繋がり、いろんな情報交換ができたらいいなと考えています。


今回はこの辺で終わりたいと思います。
みなさんのエンジニアライフに少しでもお役に立てれば幸いです。
ありがとうございました。

・【Windows版】コマンドプロンプトでC言語をコンパイルしてみた
https://note.com/tango9512357/n/nb7c3ef649c9f#qOeov

・Twitter
https://twitter.com/tango3564

・Instagram
https://www.instagram.com/tango3690/