読者です 読者をやめる 読者になる 読者になる

移動式のブログ

ガジェット、アニメ、プログラミング、考えたことその他色々・・・特にこれといったテーマはないカオスなブログです。

c言語 winsock通信プログラム 

c言語 通信プログラム クライアント側

 二つのパソコンを用意して、クライアント側からサーバー側に文字を送るプログラムを本やサイトを参考にして組んでみました。

f:id:idoushiki:20160330003006p:plain
上の図のように、パソコンを二つ用意してLANケーブルで繋ぎ、クライアント側からサーバー側に文字を送るプログラムを組めるようにしたいと思います。


 ウインドウズのPCなら、「winsock」を使えばTCP通信、UDP通信をすることができます。
 
 「winsock」について詳しくはこちら→
Geekなぺーじ:winsockプログラミング


 
 winsockには、winsock.hとwinsock2.hの2種類が存在しますが、今回はwinsock2を使っています。
  
 
 f:id:idoushiki:20160329231014p:plain
 f:id:idoushiki:20160329230536p:plain

 VisualStudioでwinsockを使うには設定が必要です。
 
 プロジェクトのプロバディで、
「構成プロバディ」→「リンカー」→「入力」を選んで、「追加の依存ファイル」に
「ws2_32.lib」と入力して「適用」を押せば、winsock2.hを利用することができます。

 

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

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

int
main(void)
{ while(1)

{
 WSADATA wsaData;



 // winsock2の初期化
 WSAStartup(MAKEWORD(1,0), &wsaData);

 struct sockaddr_in server;

 char buf[2];
 int a;
 fgets(buf,2,stdin);

 a=socket(AF_INET, SOCK_STREAM, 0);
 memset((char *)&server,0,sizeof(server));

 server.sin_family=AF_INET;
 server.sin_addr.s_addr=inet_addr("相手のIPアドレスをここに入れる");
 server.sin_port=htons(ポート番号をここに入れる);
 
 
 connect(a,(struct sockaddr *) &server, sizeof(server));

 send(a,buf,2,0);


 closesocket(a);
 
 // winsock2の終了処理
 WSACleanup();}
 
 return 0;
}

このプログラムは、クライアント側のパソコンで入力した文字をサーバー側のパソコンに送信するプログラムのクライアント側です。



・送信する文字の数を設定する

 char buf[2];←[]の中の数字を変更して送信できる文字の量を調節する。
 int a;
 fgets(buf,2,stdin);←真ん中の数字(2)はbufの[]内の数字と同じにする。

fgetsで入力した文字をbufに格納して、sendでデータをサーバー側に送る

 send(a,buf,2,0);←真ん中の数字(2)はbufの[]内の数字と同じにする。


・winsockの初期化

WSADATA wsaData;

 WSAStartup(MAKEWORD(1,0), &wsaData);

winsockで通信をするためにはまず↑のコードで初期化をする必要がある。
MAKEWORD()かっこの中の二つの数字は、winsockのバージョンを表しているので、今回は(1,0)に設定してある。


.socketの設定

 a=socket(AF_INET, SOCK_STREAM, 0);
 memset((char *)&server,0,sizeof(server));

socket関数でsocketを用意して、memset関数で(server)を0で初期化する。


・サーバー側と通信

 connect(a,(struct sockaddr *) &server, sizeof(server));

 send(a,buf,2,0);

connectでサーバーに接続する。
sendで、サーバーにbufを送信する。



・通信終了

 closesocket(a);
 
 WSACleanup();

closesocketでソケットを閉じる。(fcloseみたいな感じ)
WSACleanupでwinsockを終了する。