Wide Studio Programmer's Guide

Wide Studio Home
Up to


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


Wide Stuido Home | Up to

Copyright(C) T. Hirabayashi, 1999-2002 Last modified: June 10, 2002