[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now


SendBuf and ReceiveBuf

Posted on 2004-04-06
Medium Priority
Last Modified: 2008-02-20
Hello, here is part of my program,

function Tdhskmus1.HostIPIO(data: PChar; len: integer): integer;
      iphostcmd, respcmd: TIPHOSTCMD;
  result := 0;
  HostIP_connect; //open the socket connection
  rc := fmtIPCmd(Desrec, iphostcmd); //return number of bytes to be sent
  showmessage(format('I AM ALIVE ()', []));
  rc := host_socket.socket.SendBuf(iphostcmd, rc);
  showmessage(format('rc = %d', [rc]));
  host_socket.socket.ReceiveBuf(respcmd, sizeof(respcmd));

My question is I have to insert those 2 "showmessage" code for the program to work properly, otherwise  sendbuf and receivebuf will fail (sendbuf writes nothing). I don't understand why this would happen. I have tried insert other codes in the middle, but it appears to be only message box can make it work. Could someone tell me how to resolve it? I don't want user keep pressing enter when the program is running!
Thank you.
Question by:kc2592
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2

Expert Comment

ID: 10764709
From your code, it appears that you might not be waiting for the socket connection to be completed before sending and receiving...  putting the showmessage in between the lines causes the app to pause and allows for the connection to be completed...  perhaps you should put the code into the OnConnect event or start a timer event OnConnect that will periodically send the "I AM ALIVE" message....

Expert Comment

ID: 10766926
if you are using TClientSocket, then try to set ClientType property to ctBlocking. That will enforce synchronous data exchange between server and client i.e. program will proceed to next line only when all data will be sent.
Read also Help (TClientSocket.ClientType) about how to avoid program freezing if server hangs, for example.

wbr, mo.

Author Comment

ID: 10773364
I found that clientsocket.active property won't turn TRUE until my first showmessage code. I think that's why my sendbuf failed if I took out that code. But I thought when I established the connection, then active would be true. Any suggestion?  (I don't want my socket to be active when the application start up)
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.


Expert Comment

ID: 10774420
It's also because of ctNonBlocking ClientType. if you use nonblocking (asynchronous) connection, then execution of next line occurs immediately after connection witout waiting to connect to server host (i.e. sepparate thread is created). in nonblocking mode you should write OnRead and OnWrite events for read/write operations.
also ctNonBlocking is preferable way to perform communications. in neither case your server will respond to client while all client request is received.
Did you tried to set ClientType to ctBlocking?

Author Comment

ID: 10780637
If I use OnWrite event to do sendbuf function, then in my function, how do I trigger the OnWrite event? Or I still do sendbuf in my function, then what to do in OnWrite event?


Accepted Solution

mocarts earned 400 total points
ID: 10781396
you don't need to trigger any events - they will be triggered automatically by socket component.
here will be code template translated from your code sample:

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
  respcmd: TIPHOSTCMD;
  // if command sent then we can read server response
  if FCmdSent then
    Socket.ReceiveBuf(respcmd, sizeof(respcmd));
  end else
    raise Exception.Create('Unexpected data in client buffer!');

procedure TForm1.ClientSocket1Write(Sender: TObject;
  Socket: TCustomWinSocket);
  iphostcmd: TIPHOSTCMD;
  rc: integer;
  // if not already command sent
  if not FCmdSent then
    rc := fmtIPCmd(Desrec, iphostcmd); //return number of bytes to be sent
    rc := Socket.SendBuf(iphostcmd, rc);
    FCmdSent := True;

procedure TForm1.Button1Click(Sender: TObject);
  FCmdSent := False;
  ClientSocket1.Active := True;

wbr, mo.

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This course is ideal for IT System Administrators working with VMware vSphere and its associated products in their company infrastructure. This course teaches you how to install and maintain this virtualization technology to store data, prevent vuln…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Suggested Courses

656 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question