>  Ptr := PByte(X);
>  while iSize > 0 do begin
>    iSent := WSocket_AsClient.Send(Ptr, iSize);
>    if iSent > 0 then begin
>      Inc(Ptr, iSent);
>      Dec(iSize, iSent);
>      Continue;
>    end;

Your record will be sent in one call to Send(). No need to do a loop !
Also no need to use an intermediate pointer.
Just do:
    WSocket_AsClient.Send(X, iSize);

    if iSent = 0 then begin
      ClientSocket.Close;
      raise Exception.Create('Connection closed gracefully');
    end;

Just throw that code away ! It is not needed. In your code iSent is the 
number of bytes sent. It will always succeed because data is put into a send 
buffer for sending. You could get an exception if you run out of memory or 
if the socket is not connected.

    iErrorCode := WSAGetLastError;
    if iErrorCode <> WSAEWOULDBLOCK then
      raise Exception.CreateFmt('Socket Error: %d', [iErrorCode]);

You have to throw away this code. You'll get exceptions (to be handled with 
try/except) or you get error codes in the events arguments.

> --and in my "real" app the SessionAvailable() handler is fired, but the
> SessionConnected() does not, nor does OnDataAvailable().

I don't understand what you "real" app is. It is your server application ? 
Is it built using TWSocketServer ?
Don't use TWSocket for listening, use TWSocketServer which do all the 
housekeeping needed to handle simultaneous clients.

--
Contribute to the SSL Effort. Visit http://www.overbyte.be/eng/ssl.html
--
[EMAIL PROTECTED]
http://www.overbyte.be



----- Original Message ----- 
From: "Clay Shannon" <[EMAIL PROTECTED]>
To: "'ICS support mailing'" <twsocket@elists.org>
Sent: Friday, November 17, 2006 9:49 PM
Subject: [twsocket] Pulling my hair out trying to receive a record


>I am trying to test sending records from a utility to my app, which should
> receive and process the records.
>
>
>
> I am able to send the record from my test utility with this code:
>
>
>
> procedure TForm10.btnSendMsgAsRecordClick(Sender: TObject);
>
> begin
>
>  InitializeWSocketProperties;
>
>  WSocket_AsClient.Connect;
>
> end;
>
>
>
> procedure TForm10.InitializeWSocketProperties;
>
> begin
>
>  WSocket_AsClient.Addr := '10.172.2.93'; { TODO : After testing, read 
> these
> vals from an .INI file }
>
>  WSocket_AsClient.Port := '1234';
>
> end;
>
>
>
> {== After connecting, this event is called ==}
>
> procedure TForm10.WSocket_AsClientSessionConnected(Sender: TObject; 
> ErrCode:
> Word);
>
> begin
>
>  if ErrCode <> 0 then begin
>
>    ShowMessage(Format('Error in OnSessionConnected() event: %d',
> [ErrCode]));
>
>    Exit;
>
>  end;
>
>  SendTheCurrentRecord;
>
> end;
>
>
>
> procedure TForm10.SendTheCurrentRecord;
>
> begin
>
>  if cmbxMsgType.Items[cmbxMsgType.ItemIndex] = 'ACTIVATE_BOF_SORT' then
>
>    SendActiv8BOFSortRecord //This is the one I'm testing
>
>    . . .
>
>
>
> procedure TForm10.SendActiv8BOFSortRecord;
>
> var
>
>  X: PActivateBOFSort;
>
>  Ptr: PByte;
>
>  iSent, iSize, iErrorCode: Integer;
>
> begin
>
>  iSize := SizeOf(TActivateBOFSort);
>
>  X := AllocMem(iSize);
>
>  X^.OpCode := ACTIVATE_BOF_SORT;
>
>  X^.Carrier := StrToIntDef(edt1.Text, 0);
>
>  StrLCopy(X^.BOFSortLabel, PChar(edt2.Text), BOF_SORT_LABEL_LENGTH);
>
>  X^.WorkstationOffset := StrToIntDef(edt3.Text, 0);
>
>  X^.RecordTerminator := '~';
>
>  Ptr := PByte(X);
>
>  while iSize > 0 do begin
>
>    iSent := WSocket_AsClient.Send(Ptr, iSize);
>
>    if iSent > 0 then begin
>
>      Inc(Ptr, iSent);
>
>      Dec(iSize, iSent);
>
>      Continue;
>
>    end;
>
>    if iSent = 0 then begin
>
>      ClientSocket.Close;
>
>      raise Exception.Create('Connection closed gracefully');
>
>    end;
>
>    iErrorCode := WSAGetLastError;
>
>    if iErrorCode <> WSAEWOULDBLOCK then
>
>      raise Exception.CreateFmt('Socket Error: %d', [iErrorCode]);
>
>  end;
>
>
>
> --and in my "real" app the SessionAvailable() handler is fired, but the
> SessionConnected() does not, nor does OnDataAvailable().
>
>
>
> What am I missing here? What necessary step am I leaving out?
>
>
>
> I have this code (adapted from one of the ICS demo apps) in the
> OnSessionAvailable() handler of my receiving app:
>
>
>
> procedure TfClientMain.WSocket_AsServerSessionAvailable(Sender: TObject;
> ErrCode: Word);
>
> var
>
>  NewHSocket : TSocket;
>
>  Peer       : String;
>
> begin
>
>  { We need to accept the client connection }
>
>  NewHSocket := WSocket_AsServer.Accept;
>
>  { And then associate this connection with our client socket }
>
>  WSocket_AsClient.Dup(NewHSocket);
>
> end;
>
>
>
> ...and this code in OnSessionConnected(), but it doesn't get reached (also
> taken from some code gleaned from the mailing list):
>
>
>
> procedureTfClientMain.WSocket_AsServerSessionConnected(Sender: TObject;
> ErrCode: Word);
>
> begin
>
>  ICS_RdPtr := 0;
>
>  ICS_WrPtr := 0;
>
>  if ICS_BufferSize = 0 then begin
>
>    ICS_BufferSize := ICS_BUFFER_SIZE;
>
>    ReAllocMem(ICS_Buffer, ICS_BufferSize);
>
>  end;
>
> end;
>
>
>
> ...and this preliminary code in OnDataAvailable(), which also is not 
> getting
> reached:
>
>
>
> procedure TfClientMain.WSocket_AsServerDataAvailable(Sender: TObject;
> ErrCode: Word);
>
> var
>
>  sIncomingDataAsString: String;
>
> begin
>
>  if ErrCode <> 0 then begin
>
>    ClientDM.InsertException(
>
>      CurrentUser,
>
>      Format(sErrorNInWSocket_AsServerDataAvailable, [ErrCode]),
>
>      GetHostNameOrDefaultIPAddress);
>
>    Exit;
>
>  end;
>
>  sIncomingDataAsString := WSocket_AsServer.ReceiveStr;
>
>  ShowMessage(sIncomingDataAsString);
>
> end;
>
>
>
> Again, what am I missing here? What necessary step am I leaving out or 
> what
> basic concept do I not understand? I've been struggling with sending data
> via sockets for several days now.
>
> I've given up on the deprecated TClientSocket and TServerSocket 
> components,
> and am quite frustrated at this point. Does it really have to be this hard
> to implement?
>
>


--------------------------------------------------------------------------------


> The information transmitted is intended only for the person or entity to
> which it is addressed and may contain confidential and/or privileged
> material.  If the reader of this message is not the intended recipient,
> you are hereby notified that your access is unauthorized, and any review,
> dissemination, distribution or copying of this message including any
> attachments is strictly prohibited.   If you are not the intended
> recipient, please contact the sender and delete the material from any
> computer.
>


--------------------------------------------------------------------------------


> -- 
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://www.elists.org/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be 

-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to