![]() | Programming Guide | WideStudio/MWT Index Table of contents |
使用TCP/IP的网络通讯
制作使用TCP通口的网络通讯
通过TCP 网络通讯,可以进行顾客端和服务器端的通讯。 服务器端的 WSCvssocket Class,可受理来自顾客端 WSCvcsocket 的连接。
通常,在 C/C++语言上处理TCP 通口时,利用accept ,listen,connect 等进行连接。不过,在WideStudio,有关TCP 通口的连接处理均可内部自动进行,对利用者不公开,所以不需进行有关处理记述。
TCP 通口部件,只须使用IP 地址,PORT 的属性,就可实现。通口部件的利用者,仅仅需要对TCP 通口部件进行数据的发送接收。在TCP 通口部件里,有进行连接的一侧(顾客端),和进行接收连接的一侧(服务器方面)。
顾客端方面和服务器方面,进行连接时的动作不同。顾客端连接有特定地址和端口的网络,服务器端等待被顾客端连接。
因此,如果进行TCP 通讯,WSCvcsocket (顾客端)必须连接待命的WSCvssocket (服务器)。
顾客端的属性设定,是通过WSNip 指定所连接服务器的TCP/IP地址,和服务器的通口端口。服务器端的属性设定,是通过WSNport 指定将接受的通口端口,设定WSNrunning为ON 。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: //Store data from a client into buffer obj->read((WSCuchar*)buffer,128); //send data: //Store data for a client into buffer to send it 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){ //Initiate connection and exchange data after connection long ret = newvcso_000->exec(); if (ret != WS_NO_ERR){ //connection failed return; } } static WSCfunctionRegister op("btnop",(void*)btnop);使用UDP通口进行通知网络通讯
使用UDP时,不是与特定的服务器连接,而是对多数服务器(broadcast address:通常,xxx.xxx.xxx. 255)进行数据发送。发送时,使用被指定的端口进行数据接受的服务器将可接收数据。发送方面的属性设定时,指定对方的通口端口到WSNport中。同时,在WSNip中指定 broadcast address,通常指定为255.255.255.255。不过,对于255.255.255.255不能发送的系统,指定将发送网络地址最后地址改为255的地址。譬如,如果向10.20.30.XX 存在的非特定机器发送,指定为10.20.30.255。
接收方面的属性设定时,在WSNport中指定接受用的通口端口,设定WSNrunning为On 。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]; //send data in buffer strcpy(buffer,"send data.."); long ret = newvudp_000->write(buffer,64); if (ret < 64){ //failed. }else{ //success } } 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]; //Receiving data newvudp_000->read(buffer,64); } static WSCfunctionRegister op("recvop",(void*)recvop);
Copyright(C) WideStudio/MWT Development Team, 1999-2005 | Last modified: Jul 31, 2005 |