John
On Wed, 7 Apr 1999, Judith Katzy wrote:
>
> hi there,
>
> I'd like to send messages of about 300k in a client server environment
> using TSocket and TServerSocket.
> Everything works fine as long as I use the blocking mode for
> the socket. It also works, if I use the non-blocking mode and just send
> small objects (280 bytes).
> I get the following error on the server side, when I use the non-blocking
> mode with a 300k messages:
>
> root [1] .x server.C
> received mess 'waiting'
> SysError in <TUnixSystem::UnixSend>: send (Resource temporarily
> unavailable)
> Error in <TUnixSystem::SendRaw>: cannot send buffer
> server: error occcurred during sending event
>
> Attached, I send the macros server.C and client.C.
>
> My suspecion is, that something goes wrong when I send several
> packets with TCP/IP in a non-blocking mode, even when the
> sending is synchronized.
>
> thanks for any help,
> Judith
>
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> macro serroot.C
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> {
> // just a large object (buf size about 300k), I take a data event here
> TPhEvent *ev = dst->GetNextEvent() ;
> TMessage smess(kMESS_OBJECT);
> smess->WriteObject(ev);
> TServerSocket *ss = new TServerSocket(9091, kTRUE);
> TSocket *s0 = ss->Accept();
> s0->SetOption(kNoBlock,1);
> Int_t fSend,idx;
>
> Char_t str[32];
> Int_t fRecv, fSend;
>
> while (1)
> {
> fRecv = s0->Recv(str,32);
> if(fRecv != -4)
> {
> // client request new event
> idx = !strcmp(str, "waiting") ? 0 : 1;
> if(idx == 0)
> {
> printf("received mess '%s'\n",str);
> //***fSend = s0->Send("xxx");
> UInt_t what = smess->What();
> // synchronize sending
> smess->SetWhat(what || kMESS_ACK);
> fSend = s0->Send(smess);
> if(fSend==-1)
> printf("server: error occcurred during sending event\n");
> }
> }
> }
> s0->Close();
> ss->Close();
> }
>
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> macro client.C
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
> {
> TSocket *csock = new TSocket("judithpc.phy.uic.edu", 9091);
> csock->Send("waiting");
> TMessage *mess;
> Int_t fRecv;
> Int_t idx;
> Char_t cstr[256];
> while (1) {
> //** fRecv = csock->Recv(cstr,32);
> fRecv = csock->Recv(mess);
> if(fRecv!=-4){
> if(fRecv<0)
> {
> printf("error message received, error code %d -return\n ",fRecv);
> return;
> }
> //**printf("received %s\n",cstr);
> TPhEvent *event = (TPhEvent *)mess->ReadObject(mess->GetClass());
> printf("received %d, event %d\n",mess->What(),event->GetNEvent());
> csock->Send("waiting");
> delete mess;
> }
> }
> csock->Close();
> }
>
>
>
>
>