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
|