 |
BorlandTalk.com Borland discussion newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jim P Guest
|
Posted: Wed Sep 07, 2005 2:13 am Post subject: ClientSocket and ServerSocket questions |
|
|
The more that I look at and try to use these components the more
confused I get.
I have been using he Clientsocket to talk to a OEM printer for marking
boxes full of produce.
Now, I need to link two or more computers and pass information between
them.
I have tried setting up an array of ClientSockets to handle the
different computer connections. and an array of Serversockets to handle
the different incoming connections. I am not sure if this is the right
way.
I kind of figured this would be needed to keep track of who sent which
message and how to make sure the response goes back to the sender. As
nothing in the ServerSocket seems to have a provision for that. Or I
could be simply missing something.
Systems are windows XP, and developing with Delphi 2005 update 3
installed.
Using Hyperterminal I can make a connection and a character is received.
Only I can not tell which port it arrived on or how to send back a
response to hyperterminal and arrive back.
Note, the system will have a lot of messages flowing around totally
independent of each other. So several connections have to be made at a
time.
Is it possible somehow in the
ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
routine to get the port or as it is an array of serversockets the tag?
So as to know how to process the information?
I have tried this and it does not compile on the Socket.tag and
Socket.port lines.
ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
ver
data : string;
T, P : integer;
begin
data := Socket.receivetext;
T := Socket.tag;
P := socket.port;
....
I have tried
ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
T,P : integer;
Data : String;
The_Server : TServerSocket;
begin
// --- get server connection
Assert(Sender is TServerSocket,'Error');
The_Server := TServerSocket(Sender);
data := Socket.receivetext;
T := The_Server.tag;
P := The_Server.port;
. . . .
This compiles but crashes on the Assert statement
An exception of class EAssertionFialed is Raised with Message
'Error (C:simsink jet Stamperheadinterface.pas, line 1097)'
which is the line of code with the Assert statement.
This seems to compile and run but the tag and port values are not what
would be expected.
procedure THead_Interface_Form.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Data : string;
The_Server : TServerSocket;
T : integer;
P : integer;
begin
// --- get server connection
Assert(Sender is TcustomwinSocket,'Error');
The_Server := TServerSocket(Sender);
Data := Socket.ReceiveText;
T := The_Server.tag;
P := The_Server.port;
T is 0 and P becomes 91741920, while Hyperterminal is connected to port
1016. and the tag should be 16.
I have added code to get the Name property that I also define at runtime
as the program creates the ServerSockets and assigns the Event Handlers
(routines). The name property is not accessable with an exception from a
a read of an address. -
So am I going about this the wrong way? Is there a better way? What am I
missing?
Thanks
Jim P.
|
|
| Back to top |
|
 |
Remy Lebeau (TeamB) Guest
|
Posted: Wed Sep 07, 2005 6:11 am Post subject: Re: ClientSocket and ServerSocket questions |
|
|
"Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote
| Quote: | I have tried setting up an array of ClientSockets to handle the
different computer connections. and an array of Serversockets
to handle the different incoming connections. I am not sure if this
is the right way.
|
It is not. You do not need an array of servers. A single server can manage
connections to multiple clients at a time.
| Quote: | I kind of figured this would be needed to keep track of who sent
which message and how to make sure the response goes back to
the sender.
|
Also not true. The various events of the clients and servers each have a
Socket parameter that represents the socket that is triggering the events.
You are supposed to be using those parameters to know who is who at the time
of each event.
| Quote: | As nothing in the ServerSocket seems to have a provision for that.
|
Again, not true, for the reason above.
| Quote: | Using Hyperterminal I can make a connection and a character is
received. Only I can not tell which port it arrived on or how to send
back a response to hyperterminal and arrive back.
|
Everything is done through the Socket parameters in the event handlers.
| Quote: | Is it possible somehow in the
ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
routine to get the port or as it is an array of serversockets the tag?
|
You do not need to know either of those values in order to communicate with
the client. Simply use the Socket parameter directly. Writing to or
reading from that object transmits the data to/from the appropriate client.
| Quote: | I have tried this and it does not compile on the Socket.tag and
Socket.port lines. |
Nor should it. TCustomWinSocket has no such properties available.
There is no Tag value available. If you must know which port the client is
connected to, then use the TCustomWinSocket.LocalPort property. To know
which port the client is bound to on its end of the connection, use the
TCustomWinSocket.RemotePort property instead.
| Quote: | This compiles but crashes on the Assert statement
|
As well it should be, because the Sender is NOT the TServerSocket. It is
the TServerWinSocket object that is represented by the TServerSocket.Socket
property.
| Quote: | This seems to compile and run but the tag and port values are
not what would be expected.
|
Then you are expecting the wrong things to begin with.
| Quote: | T is 0 and P becomes 91741920
|
That is because the Sender of the OnClientRead event is NOT a TServerSocket
to begin with, so you are type-casting the Sender to the wrong class type
and thus accessible the wrong memory.
| Quote: | I have added code to get the Name property that I also define at
runtime as the program creates the ServerSockets and assigns the
Event Handlers (routines). The name property is not accessable
with an exception from a a read of an address. -
|
That is the same as above - your are type-casting incorrectly and thus
accessing the wrong memory.
Gambit
|
|
| Back to top |
|
 |
Jim P Guest
|
Posted: Wed Sep 07, 2005 6:23 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
Remy
Let me see if I understand you correctly.
One Serversocket is all that is needed. This uses the IP address
assigned to the netcard. - thus the computer.
The serversocket has a port # assigned to it. This number and the IP
address is the defining connection point. Kind of like a phone number
and extension. They must be right and when tested that proves true.
So to have different computers connected (note this is a series of
computers connected on an internal network) and know which computer is
the one sending the information. I kind of figured use the port to
define it.
So for this aspect, I still have to have a serversocket for each port
that is allowed or provided. As I understand it.
Having one common read routine - - I need to read the property LocalPort
to see which of the serversockets Ports actually is handling the data
(ah is that right)
Each Serversocket can handle multiple connections at one time. - -
So I can setup one ServerSocket and have all of the information coming
in on that one Serversocket on the one port #. I can have the packet of
information contain information about the source of the connection,
Computer, IP, What ever is needed to respond back to that connection.
But how does the serversocket know to send the response back to the
sending connection (client)? - - to which client that is connected.
This becomes my confusion. How to keep them all straight. or more better
put how it is keep straight.
I figure systems to handle this must be present somehow, someway, I just
do not know them yet. And hints?
---------------
If I have all of the clients connecting to one port. How is the response
send back to the right client? Localport? But all the clients are on
the same port connection?
---------------
Do I keep the array of serversockets as I have and look at the localport
on the event - to see which serverSocket is the one that is handling
this connection and thus which to send the response back to as
Serversocket[localport].socket.sendtext('- - - - - '); or as it should
be send back as - - -
am I making too much of this? I was once told in Delphi - stop and think
of the easy way. That is most likely the right way.
Jim P.
Remy Lebeau (TeamB) wrote:
| Quote: | "Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote in message
news:431e4c3f$1 (AT) newsgroups (DOT) borland.com...
I have tried setting up an array of ClientSockets to handle the
different computer connections. and an array of Serversockets
to handle the different incoming connections. I am not sure if this
is the right way.
It is not. You do not need an array of servers. A single server can manage
connections to multiple clients at a time.
I kind of figured this would be needed to keep track of who sent
which message and how to make sure the response goes back to
the sender.
Also not true. The various events of the clients and servers each have a
Socket parameter that represents the socket that is triggering the events.
You are supposed to be using those parameters to know who is who at the time
of each event.
As nothing in the ServerSocket seems to have a provision for that.
Again, not true, for the reason above.
Using Hyperterminal I can make a connection and a character is
received. Only I can not tell which port it arrived on or how to send
back a response to hyperterminal and arrive back.
Everything is done through the Socket parameters in the event handlers.
Is it possible somehow in the
ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
routine to get the port or as it is an array of serversockets the tag?
You do not need to know either of those values in order to communicate with
the client. Simply use the Socket parameter directly. Writing to or
reading from that object transmits the data to/from the appropriate client.
I have tried this and it does not compile on the Socket.tag and
Socket.port lines.
Nor should it. TCustomWinSocket has no such properties available.
There is no Tag value available. If you must know which port the client is
connected to, then use the TCustomWinSocket.LocalPort property. To know
which port the client is bound to on its end of the connection, use the
TCustomWinSocket.RemotePort property instead.
This compiles but crashes on the Assert statement
As well it should be, because the Sender is NOT the TServerSocket. It is
the TServerWinSocket object that is represented by the TServerSocket.Socket
property.
This seems to compile and run but the tag and port values are
not what would be expected.
Then you are expecting the wrong things to begin with.
T is 0 and P becomes 91741920
That is because the Sender of the OnClientRead event is NOT a TServerSocket
to begin with, so you are type-casting the Sender to the wrong class type
and thus accessible the wrong memory.
I have added code to get the Name property that I also define at
runtime as the program creates the ServerSockets and assigns the
Event Handlers (routines). The name property is not accessable
with an exception from a a read of an address. -
That is the same as above - your are type-casting incorrectly and thus
accessing the wrong memory.
Gambit
|
|
|
| Back to top |
|
 |
Remy Lebeau (TeamB) Guest
|
Posted: Wed Sep 07, 2005 8:02 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
"Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote
| Quote: | One Serversocket is all that is needed.
|
Yes.
| Quote: | This uses the IP address assigned to the netcard. - thus the computer.
|
A ServerSocket can be bound to a specific IP (in the case of multiple NIC
cards installed) or to the entire machine globally regardless of any
particule IP address.
| Quote: | The serversocket has a port # assigned to it. This number and the IP
address is the defining connection point.
|
Yes.
| Quote: | So to have different computers connected (note this is a series of
computers connected on an internal network) and know which
computer is the one sending the information. I kind of figured use
the port to define it.
|
You do not need to know the port in order to send data back and forth once
the connection has been established. As I already told you earlier, use the
Socket parameter of the event handlers, it handles the routing for you.
| Quote: | So for this aspect, I still have to have a serversocket for each port
that is allowed or provided. As I understand it.
|
An application running on a machine only needs 1 ServerSocket in order for
other machines to connect to it. Multiple clients on different machines can
all connect to a single ServerSocket.
| Quote: | Having one common read routine - - I need to read the property
LocalPort to see which of the serversockets Ports actually is handling
the data (ah is that right)
|
Once again, you DO NOT need to know the port in order to send or read data.
The Socket parameter of the event handlers has reading and writing methods
available and will handle everything for you.
| Quote: | Each Serversocket can handle multiple connections at one time. - -
|
Yes.
| Quote: | So I can setup one ServerSocket and have all of the information coming
in on that one Serversocket on the one port #.
|
Yes.
| Quote: | I can have the packet of information contain information about
the source of the connection, Computer, IP, What ever is needed
to respond back to that connection.
|
That is not necessary. Once again, just use the Socket parameter of the
event handlers to handle the reading and writing for you. That is all you
need to do.
| Quote: | But how does the serversocket know to send the response back
to the sending connection (client)? - - to which client that is
connected. |
Every connection has its own TCustomWinSocket object inside the
ServerSocket. The Socket parameter of the event handlers is the
TCustomWinSocket for the particular client that each event is being
triggered for. Accessing that Socket object is almost like accessing the
particular client directly.
| Quote: | This becomes my confusion. How to keep them all straight. or
more better put how it is keep straight.
|
There is nothing to keep straight. The ServerSocket manages all of the
tracking for you. All you need to do is when a particular event is
triggered, it is being triggered for a particular connection, so all reading
and writing with that Socket parameter will operate on that particular
connection and no other.
| Quote: | If I have all of the clients connecting to one port. How is
the response send back to the right client?
|
Via the provided TCustomWinSocket object when an event is triggered.
No.
| Quote: | But all the clients are on the same port connection?
|
No. They each have their own separate connection. Just because they all
connect to the same port number does NOT mean that they share a single
connection. A TCP connection is uniquely identified by BOTH the client
IP/port and the server IP/port that make up the two endpoints of the
connection. Even though all of the clients connect to the same ServerSocket
IP/port, the client-side IP/port will be different between clients, and thus
each client will have its own unique individual connection to the
ServerSocket.
| Quote: | Do I keep the array of serversockets as I have and look at
the localport on the event
|
No.
| Quote: | - to see which serverSocket is the one that is handling this
connection
|
That is not necessary.
| Quote: | and thus which to send the response back to as
Serversocket[localport].socket.sendtext('- - - - - ');
|
That is not correct. You cannot send data using the Socket property of
TServerSocket. You need to use the Socket parameter of the event handlers.
| Quote: | or as it should be send back as - - -
|
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket:
TCustomWinSocket);
var
S: String;
begin
S := Socket.ReceiveText;
//...
Socket.SendText('- - - - - ');
//...
end;
| Quote: | am I making too much of this?
|
Yes.
Gambit
|
|
| Back to top |
|
 |
Jim P Guest
|
Posted: Wed Sep 07, 2005 8:29 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
Gambit
| Quote: | procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket:
TCustomWinSocket);
var
S: String;
begin
S := Socket.ReceiveText;
//...
Socket.SendText('- - - - - ');
//...
end;
am I making too much of this?
Yes.
Gambit
|
From what you said, evolved to basically what you have here.
The only problem is that I need the server to send information to the
client without the client asking for information. Is that possible?
I am assuming that I have to save the socket and thus can access and use
that the socket for the sending.
At present I have hyperterminal talking to my application just fine and
receiving response back from the send. (waits for CR before responding)
and that all seems to behave just fine.
Thanks for the Help - - Like I said. Delphi has an easy way. Just do not
always see it at first. One complain is to have better documentation.
But then how do you document inherited components. Such as in TMemo. How
to add a line. Ah that is in the Lines Property. So sometimes it is a
bit tricky to find what you are looking for. As in this case. Seems
that serversocket can have 'N' sockets that it causes. That are not
really or totally part of serversocket. but are related to it somehow.
Jim P.
|
|
| Back to top |
|
 |
Remy Lebeau (TeamB) Guest
|
Posted: Wed Sep 07, 2005 9:19 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
"Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote
| Quote: | The only problem is that I need the server to send information to
the client without the client asking for information. Is that possible?
|
TServerSocket has ActiveConnections and Connections[] properties available.
You can access any connection at any time from outside of the event
handlers. It is your own responsibility to determine which connection to
send to when needed.
Typically, for such a design requirement, I would suggest another approach -
set the ServerSocket's ServerType property to stThreadBlocking. Then derive
a new class from TServerClientThread and override the ClientExecute()
method. In the server's OnGetThread event, create and return a new instance
of that thread class. This way, the thread can immediately begin writing to
the client without waiting for the client to request anything, and your code
is isolated and organized very cleanly. Each thread instance handles a
particular client connection. For example:
type
TMyThread = class(TServerClientThread)
protected
procedure ClientExecute; override;
end;
procedure TMyThread.ClientExecute;
var
Strm: TWinSocketStream;
begin
Strm := TWinSocketStream.Create(ClientSocket, 5000);
try
while (not Terminated) and (ClientSocket.Connected) do
begin
// send a packet of data as needed using Strm.Write()
end;
finally
Strm.Free;
end;
end;
procedure TForm1.ServerSocket1GetThread(Sender: TObject; ClientSocket:
TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
SocketThread := TMyThread.Create(False, ClientSocket);
end;
Gambit
|
|
| Back to top |
|
 |
Jim P Guest
|
Posted: Fri Sep 09, 2005 5:45 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
Remy Lebeau (TeamB) wrote:
| Quote: | "Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote in message
news:431f4cf7$1 (AT) newsgroups (DOT) borland.com...
The only problem is that I need the server to send information to
the client without the client asking for information. Is that possible?
TServerSocket has ActiveConnections and Connections[] properties available.
You can access any connection at any time from outside of the event
handlers. It is your own responsibility to determine which connection to
send to when needed.
Typically, for such a design requirement, I would suggest another approach -
set the ServerSocket's ServerType property to stThreadBlocking. Then derive
a new class from TServerClientThread and override the ClientExecute()
method. In the server's OnGetThread event, create and return a new instance
of that thread class. This way, the thread can immediately begin writing to
the client without waiting for the client to request anything, and your code
is isolated and organized very cleanly. Each thread instance handles a
particular client connection. For example:
type
TMyThread = class(TServerClientThread)
protected
procedure ClientExecute; override;
end;
procedure TMyThread.ClientExecute;
var
Strm: TWinSocketStream;
begin
Strm := TWinSocketStream.Create(ClientSocket, 5000);
try
while (not Terminated) and (ClientSocket.Connected) do
begin
// send a packet of data as needed using Strm.Write()
end;
finally
Strm.Free;
end;
end;
procedure TForm1.ServerSocket1GetThread(Sender: TObject; ClientSocket:
TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
SocketThread := TMyThread.Create(False, ClientSocket);
end;
Gambit
Gambit |
Got it working - - not as fancy as what you are suggesting.
Upon connection and first(every) message, I save the socket to an array
of allowed connections. (port address as index into the array) Then I
have locked the socket to a port - - - and thus can write to it at any
time.
Works good. I have the two computer linked and running just fine. So
software things outside of the linking and operation to be handled yet.
One issue that you could help me with. As both computers can talk to
each other and the way the system is configured -- no real server - any
computer can be in effect the server - - the same software on both.
So this means that both computers can in effect be the master. This is
for combining reports (OEM machine that prints the end of the box full
of apples and pears)
My issue is that I am getting error messages that I want to handle and
not have show up and cause issues on the screen.
These are messages such as one computer is up and trying to link to the
other but the other is not up and running yet. Or when one has been shut
down for some reason.
Is there a way to catch these messages and not allow them to be
presented to the operator. And have my software handle them.
I have added means of holding information during time of loss of net
connection for any reason. So that is not an issue.
Thanks again for your help. It is fun watching the interaction between
the two computes on the status screens. (mainly for debug - operator
will never see them.)
Jim P.
|
|
| Back to top |
|
 |
Remy Lebeau (TeamB) Guest
|
Posted: Fri Sep 09, 2005 7:50 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
"Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote
| Quote: | Upon connection and first(every) message, I save the socket to
an array of allowed connections. (port address as index into the
array) Then I have locked the socket to a port - - - and thus
can write to it at any time.
|
I do not suggest that approach. Asside from the fact that the server
already stores an array of connections for you, if the port ever changes
than your indexes will break as well.
| Quote: | My issue is that I am getting error messages that I want to handle
and not have show up and cause issues on the screen.
|
What kind of errors exactly? Are you using the OnError and OnClientError
events at all?
Gambit
|
|
| Back to top |
|
 |
Jim P Guest
|
Posted: Fri Sep 09, 2005 11:22 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
Remy Lebeau (TeamB) wrote:
| Quote: | "Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote in message
news:4321c985$2 (AT) newsgroups (DOT) borland.com...
Upon connection and first(every) message, I save the socket to
an array of allowed connections. (port address as index into the
array) Then I have locked the socket to a port - - - and thus
can write to it at any time.
I do not suggest that approach. Asside from the fact that the server
already stores an array of connections for you, if the port ever changes
than your indexes will break as well.
My issue is that I am getting error messages that I want to handle
and not have show up and cause issues on the screen.
What kind of errors exactly? Are you using the OnError and OnClientError
events at all?
Gambit
Part of this was knowing which stamper that is connected is the one |
involved. and sending back to that one. Maybe not the normal way but it
is working for me. I will be pondering and wrapping my head around the
other way. the more normal delphi way.
I am adding OnError handlers right now. Mainly at this time to simply
put up error status and things like that at this point. I have a timer
that checks for the connected property and if it is to be connected and
it is not then makes an other attempt at connecting. (this is where the
repeated errors come from. - the other computer has not been turned on
yet. - - timer is set for 15 seconds or so)
Once fully connected it works great. but when one or the other computer
is down, - - of course errors are occuring and need to trap the error
messages.
Any comments on that? Will the OnError and OnClientError event handlers
in effect catch and stop these error dialog boxs from poping up over and
over and on top of each other?
Thanks again for your help.
Jim P.
|
|
| Back to top |
|
 |
Remy Lebeau (TeamB) Guest
|
Posted: Fri Sep 09, 2005 11:35 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
"Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote
| Quote: | Part of this was knowing which stamper that is connected
is the one involved. and sending back to that one.
|
In the server's OnConnect event, you can assign custom data to the
TCustomWinSocket::Data property to identify the socket however you like.
When performing a task, keep track of that identifier. This way, when you
access the server's Connections[] list later on, you can look for that
identifier in order to know which socket to send to.
| Quote: | I have a timer that checks for the connected property and if it
is to be connected and it is not then makes an other attempt at
connecting.
|
That may not always work. The Connected property is not always accurate.
Sometimes it can remain 'true' even though the socket is actually
disconnected.
| Quote: | Will the OnError and OnClientError event handlers in effect
catch and stop these error dialog boxs from poping up over
and over and on top of each other?
|
Not by themselves, no. To stop an error from generating an exception, you
need to set the ErrorCode parameter to 0 before exiting the handler.
Gambit
|
|
| Back to top |
|
 |
Jim P Guest
|
Posted: Sat Sep 10, 2005 8:22 pm Post subject: Re: ClientSocket and ServerSocket questions |
|
|
Remy Lebeau (TeamB) wrote:
| Quote: | "Jim P" <Jim_P (AT) mad (DOT) scientist.com> wrote in message
news:432218af$1 (AT) newsgroups (DOT) borland.com...
Part of this was knowing which stamper that is connected
is the one involved. and sending back to that one.
In the server's OnConnect event, you can assign custom data to the
TCustomWinSocket::Data property to identify the socket however you like.
When performing a task, keep track of that identifier. This way, when you
access the server's Connections[] list later on, you can look for that
identifier in order to know which socket to send to.
I have a timer that checks for the connected property and if it
is to be connected and it is not then makes an other attempt at
connecting.
That may not always work. The Connected property is not always accurate.
Sometimes it can remain 'true' even though the socket is actually
disconnected.
Will the OnError and OnClientError event handlers in effect
catch and stop these error dialog boxs from poping up over
and over and on top of each other?
Not by themselves, no. To stop an error from generating an exception, you
need to set the ErrorCode parameter to 0 before exiting the handler.
Gambit
Yep, the setting of errorcode to 0 works perfectly. No more popping up |
Socket Error box's
So what is the best way besides ping-ing the other end of the connection
to be sure that it is active?
Should I be checking the Active property?
Note in this application the computers beging linked are most likely in
the same building and within feet of each other. No external Network.
This is all done on the internal network of the packing shed - and in
the first application for the linking software. - - the two computers
are connected and that is all. Not connected to the rest of the
company's network. (yet)
So I figure dropped connections and a lot of the things you have to
worry about over the internet do not exist here. It is more - is the
other computer up and running - - - type of check. and handle the
condition when the other computer is not up and runninng.
The IP addresses will be hard assigned as there might not really be a
server - - in the case of two computers networked. - - no server to
assign IP Addresses.
Would this application tend to be simplier and the connection property
be enough to check? Right now all seems to be working and connection
going false occurs when one of the two computers has my program turned off.
Thanks again for your response.
Jim P.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|