![]() |
TCP/IP を使ったネットワーク通信TCPソケットを使ったネットワーク通信をするにはTCP ネットワーク通信は、クライアント、サーバ接続指向の通信を行います。 サーバ側ソケット WSCvssocket クラスは、 クライアント側ソケット WSCvcsocket からの接続を受け付けます。 通常、TCP ソケットを C/C++ 言語上で取り扱う場合、 accept や、listen、connect 等を利用して接続をおこないますが、 WideStudioでは、TCP ソケットの接続に関する処理は 部品内部で自動的に行い、部品の利用者には隠蔽されていて、 それらに関する処理は記述する必要がありません。 TCP ソケット部品は、IP アドレスや、PORT のプロパティを 持ち、設定するだけで機能するように出来ており、 ソケット部品の利用者は単に、 TCP ソケット部品に対し、データの送受信を行います。 TCP ソケット部品には、接続を行う側(クライアント側) 接続を受け付ける側(サーバ側)とがあります。![]() クライアント側とサーバ側では、主に 接続を行う際の動作が異なります。 クライアント側はネットワーク上のある特定のアドレスとポートに 存在するサーバーに接続しに行くのに対して、 サーバ側は、クライアントから接続されるのを待ちます。 従って、TCP 通信を行う場合、 WSCvcsocket (クライアント側)は必ず、接続待機している WSCvssocket (サーバ側)に接続しなければなりません。 クライアント側におけるプロパティの設定は、WSNip に接続先サーバの TCP/IP アドレスを指定し、WSNport に相手先サーバのソケットのポートを 指定します。 サーバ側におけるプロパティの設定は、 WSNport に受け付け用のソケットのポートを指定し、WSNrunning をオンに設定します。 WSNip には通常、特に設定を行いませんが、もし 同じマシンに複数のアドレスが存在し、そのアドレスのうち受け付けるアドレス を特定する場合のみ、WSNip を指定します。 クライアント側で WSCvcsocket::exec メソッドを実行することにより、 サーバー側の WSCvssocket へ接続が行われます。 接続が行われると、クライアント側、サーバー側双方で ACITVATE イベントが 発生し、その起動されるイベントプロシージャにおいて通信を行います。 ![]() 接続に成功した際、ACTIVATE で起動されるイベントプロシージャの クライアント側データ送受信のサンプルです。 #include <WScom.h> #include <WSCfunctionList.h> #include <WSCbase.h> //---------------------------------------------------------- //Function for the event procedure //---------------------------------------------------------- #include <WSCvcsocket.h> void com_ep(WSCbase* object){ //do something... WSCvcsocket* sock = (WSCvcsocket*)object->cast("WSCvcsocket"); char buffer[128]; sprintf(buffer,"test!!! %d",cnt); cnt++; //send data; long send_len = sock->write((WSCuchar*)buffer,128); if (send_len == 128){ //success! do something.. }else{ //error! return; } //receive data; buffer[0] = 0; long recv_len = sock->read((WSCuchar*)buffer,128); if (recv_len == 128){ //success! do something.. }else{ //error! return; } } static WSCfunctionRegister op("com_ep",(void*)com_ep);次は接続確立時にACTIVATE で起動されるサーバー側のデータ送受信プロシージャのサンプルです。 #include <WScom.h> #include <WSCfunctionList.h> #include <WSCbase.h> //---------------------------------------------------------- //Function for the event procedure //---------------------------------------------------------- #include <WSCvssocket.h> void com_ep(WSCbase* object){ //do something... WSCvssocket* obj = (WSCvssocket*)object->cast("WSCvssocket"); char buffer[128]; //receive data: //クライアントからのデータが buffer に格納 obj->read((WSCuchar*)buffer,128); //send data: //クライアントへののデータを buffer に格納して送信。 strcpy(buffer,"send data..."); obj->write((WSCuchar*)buffer,128); } static WSCfunctionRegister op("com_ep",(void*)com_ep);次は接続確立してデータの送受信をさせる、クライアント側のイベントプロシージャのサンプルです。 #include <WScom.h> #include <WSCfunctionList.h> #include <WSCbase.h> //---------------------------------------------------------- //Function for the event procedure //---------------------------------------------------------- #include <WSCvcsocket.h> extern WSCvcsocket* newvcso_000; void btnop(WSCbase* object){ //接続開始、接続後、データ送受信を行わせます。 long ret = newvcso_000->exec(); if (ret != WS_NO_ERR){ //接続失敗 return; } } static WSCfunctionRegister op("btnop",(void*)btnop); UDPソケットを使った同報ネットワーク通信をするにはUDP の場合、特定の相手と接続することなく、 不特定多数(ブロードキャストアドレス:通常は、xxx.xxx.xxx.255)に対して データ送信することができます。 送信時に指定されたポートでデータを待ち受けているものがデータを受け取ります。![]() 送信側におけるプロパティの設定は、 WSNport に相手先のソケットのポートを指定します。 また、WSNip にブロードキャストアドレス 、通常は、255.255.255.255、を指定しますが、255.255.255.255 では送信 できないシステムでは、送信先ネットワークアドレスの末桁を 255 にしたもの を指定します。たとえば、10.20.30.XX に存在する不特定のマシンに送信する場合、 10.20.30.255 を指定します。 受信側におけるプロパティの設定は、 WSNport に受け付け用のソケットのポートを指定し、WSNrunning をオンに設定します。 WSNip には通常、特に設定を行いませんが、もし 同じマシンに複数のアドレスが存在し、そのアドレスのうち受け付けるアドレス を特定する場合のみ、WSNip を指定します。 送信側は、接続を行わない分、TCP の場合に比べて単純です。 単に、WSCvudpsocket::write を呼び出し、データを送信します。 #include <WScom.h> #include <WSCfunctionList.h> #include <WSCbase.h> //---------------------------------------------------------- //Function for the event procedure //---------------------------------------------------------- #include <WSCvudpsocket.h> extern WSCvudpsocket* newvudp_000; void btnop(WSCbase* object){ static long cnt = 0; WSCuchar buffer[64]; //buffer にデータを格納し、送信 strcpy(buffer,"send data.."); long ret = newvudp_000->write(buffer,64); if (ret < 64){ //送信失敗 }else{ //送信成功 } } static WSCfunctionRegister op("btnop",(void*)btnop);受信側は、TCP のサーバー側と同じように、ACTIVATE イベントで起動する イベントプロシージャにおいて受信します。 #include <WScom.h> #include <WSCfunctionList.h> #include <WSCbase.h> //---------------------------------------------------------- //Function for the event procedure //---------------------------------------------------------- #include <WSCvudpsocket.h> extern WSCvudpsocket* newvudp_000; void recvop(WSCbase* object){ WSCuchar buffer[64]; //データの受信 newvudp_000->read(buffer,64); } static WSCfunctionRegister op("recvop",(void*)recvop); Document Release 3.00 For Use with Wide Studio Release 3.00, Summper 2002
|