![]() | Programming Guide | WideStudio/MWT Index 目次 |
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);
Copyright(C) WideStudio/MWT Development Team, 1999-2005 | Last modified: Jul 31, 2005 |