IPX & SPX Custom Controls For Visual BasicTM 3.0 & WindowsTM 3.1 Introduction IPX (Internetwork Packet Exchange) protocol is a datagram (connectionless) service used as the underlying protocol in Novell NetWare. IPX establishes no connections nor guarantee of delivery. Each packet a workstation sends is treated separately. SPX (Sequenced Packet Exchange) is a connection-oriented protocol providing guaranteed packet delivery, flow control, and sequencing. SPX has many of the characteristics of the transport level of OSI. IPX/SPX are adaptations of protocols developed by Xerox(r), the Xerox Network System, XNS(tm). NetWare addressing is similar to the postal service's addressing system that identifies recipients by country, state, city, street, number, apartment, and individual names. NetWare addresses consist of three components: network number, node address, and socket. Network numbers identify each segment of an internetwork. Network numbers are assigned when NetWare file servers and bridges are installed. IPX derives the node address from the address of each network adapter card. Socket numbers provide routing within a node, since several processes can be running simultaneously. Processes can open and close sockets to receive and send packets. The IPX and SPX custom controls allow you to communicate with remote machines connected by a local area network. To use the control, you must have the workstations set up as NetWare clients. This involves loading IPX.COM or IPXODI.COM before Windows loads. The examples provided also require installing NETX or VLMs because they use several NetWare services to find other users. The IPX and SPX custom controls are event driven and relieve the application from polling the status of network communication channels. When new data is received from a remote machine, the IPX or SPX custom control fires a Visual Basic subroutine allowing the application to service the received information. Several examples are provided showing how to use the controls. Further information about IPX and SPX can be found in the following references: Client SDK Documentation and C Programmer's Guide by Novell, C Programmer's Guide To NetBIOS, IPX And SPX by W. David Schwaderer, Programmer's Guide to NetWare by Charles Rose, and Network Programming in C, by Barry Nance. Control Properties (These properties apply to both controols, unless indicated otherwise) Socket [form.]Control.Socket[ = numericexpression] Sets the socket that the control listens to and sends packets out through. Example: spx1.Socket = &H5454 ReceiveECBS [form.]Control.ReceiveECBS[ = numericexpression] Settings Default = 5 Sets the number of ECBs that are used to receive packets. Currently, this property should only be set in the design environment and not at run time. SendECBS [form.]Control.SendECBS[ = numericexpression] Settings Default = 1 Sets the number of ECBs that are used to send packets. Currently, this property should only be set in the design environment and not at run time. In addition, this property should currently be set to 1. Channels [form]Control.Channels[ = numericexpression] (not applicable for IPX) Settings Default = 1 Sets the maximum number of connections that the control will need to service. This property can be set once after the control is loaded and cannot change until the control is reloaded. Currently, this property has no effect. Example: spx1.Channels = 1 Connection [form]Control.Connection (not applicable for IPX) Returns the SPX connection ID assigned to this connection by SPX. This ID may be used to make SPX calls in NWIPXSPX.DLL. Example: id% = spx1.Connection Send [form.]Control.Send[ = stringexpression] Sends stringexpression to a remote node specified by RemoteName. Example: spx1.Send="HELLO WORLD" Received [form.]Control.Received Return Data Type String Retrieves data retrieved from the network. When data is received, the control will call the Visual Basic subroutine spx1_ReceiveData Example: Sub spx1_ReceiveData () Data$ = spx1.Received End Sub ReceivedFrom [form.]Control.ReceivedFrom Return Data Type String * 12 Returns the internet address (network, node, and socket) of the node that sent the most recently received packet. Example: Sub spx1_ReceiveData() From$ = spx1.ReceivedFrom Data$ = spx1.Received End Sub Event [form.]Control.Event Return Data Type Integer Retrieves an event about the connection. An event is any activity (received data, errors, new connection with a remote, lost connection with a remote, etc.) related to the connection. When an event occurs, the control will fire the subroutine spx1_LinkEvent. Example: Sub spx1_LinkEvent () Event% = spx1.Event End Sub Status [form.]Control.Status [ = { 0}] (not applicable for IPX) Status Initialization: 0 Disable Status Information: 1 Control is listening for a connection 2 Control is trying to establish a connection 3 Control has established a connection, ready to send 4 Control is terminating the connection Controls a connection and will contain status information. Setting the Status property to 0 will terminate any connection. Example: spx1.Status = 0 'Terminate any connection LinkType [form.]Control.LinkType [ = numericexpression] (not applicable for IPX) Settings Default 1 1 establish a session with remote 2 listen for connection Set the control's mode of operation. This may be changed at any time. Example: spx1.LinkType = 2 LocalName [form.]Control.LocalName Return Data Type String * 12 Returns the internet address of the current workstation (network, node, and socket). Example: myAddress = spx1.LocalName RemoteName [form.]Control.RemoteName[ = string expression] Set the internet address that the control will use to send and receive data. This may be changed at any time. Example: spx1.RemoteName = yourAddress Control Events LinkEvent() This event is called each time an event for a connection occurs. An event might be an IPX/SPX error or an event listed in the event table. The application should check the value of the Event property during this event. Example: Sub spx1_LinkEvent() Event% = spx1.Event() End Sub ReceiveData() This event is called each time data is received. The application should retrieve the value of Received during this event. Example: Sub spx1_ReceiveData() Data$ = spx1.Received() End Sub SentData() This event is called each time the control has transmitted data. Example: Sub spx1_SentData() ' Ready to send next packet End Sub Example Applications NETCHAT.MAK This example application uses the IPX control to send IPX packets to another workstation and allow the users to chat to one another. The application uses a simple protocol and finite state machine to connect to another application, send and receive data, and then disconnect from the other application. This application also uses several calls provided by NWCALLS.DLL to find all the other users and their internet addresses. CLIENT.MAK & SERVER.MAK These two examples demonstrate the SPX control in a simple client/server protocol. The client application sends a directory command to the server, which returns a directory listing of the server's current directory. To set an application, all that is needed is to set the LinkType property to 2. To be a client, set the LinkType property to 1. Event Values Any of the following events will trigger a spx1_LinkEvent call. The value returned by Event is listed in the left column and its meaning is listed on the right. 237 Abnormal Connection Termination 238 Invalid Connection 239 Connection Table Full 241 IPX/SPX Not Installed 242 No DOS Memory 243 No Free ECB 244 Lock Failed 245 Over the Maximum Limit 246 IPX/SPX Previously Initialized 252 Socket Not Opened SPX Command Canceled with IPXCancelEvent 253 Malformed Packet SPX Packet Overflow 255 SPX Socket Not Opened Visual Basic Errors The following is a list of special errors than can be returned by the IPX/SPX custom controls. The value in the left column is the error code returned in the Visual Basic "Err" variable and its meaning is on the right. 22001 IPX not installed 22002 SPX not installed 22003 Currently only 1 user allowed 22004 Socket not opened Visual Basic is a trademark of Microsoft Corporation. Windows is a registered trademark of Microsoft Corporation. IPX/SPX, NetWare are registered trademarks of Novell, Inc. Xerox Network System is a registered trademark of Xerox. IPXSPX.DOC