> 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