List:
This is my first manager client that I've written so please bear with me:
I am trying to write a C manager interface client to interface with our CRM
software. I am having an issue while reading the data from the manager
interface.
I am writing this in C and I have the following code:
while(1)
{
bzero(buffer,sizeof(buffer));
readCode = read(socketHandle,buffer,sizeof(buffer));
if(readCode < 0)
{
printf("ERROR READING FROM SOCKET\n");
exit(0);
}
printf("%s",buffer);
}
This prints out everything just as connecting to the telnet session would print
it out (I do the logging in elsewhere, that isn't the problem here)
This code will read until * has nothing else for me to read from it then print
it all out and wait for some more stuff. Since * seems to print out on 5038 in
"blocks" of text read(...) will never cut off in the middle of a
block.
However, on one instance, and this is the only one we can reproduce the results
on, * puts out Event: ****** then stops, Privilege: ********, then stops and
then prints out the rest. This really screws up my parsing as i normally parse
using a tokenizer on \r\n\r\n and pass each block off to a parsing method. I
found this problem using the following code:
while(1)
{
bzero(buffer,sizeof(buffer));
readCode = read(socketHandle,buffer,sizeof(buffer));
if(readCode < 0)
{
printf("ERROR READING FROM SOCKET\n");
exit(0);
}
printf("%s\n",buffer); ////////This is the main difference \n
}
In this case I get output as follows:
...
...
.
.
Event: Hangup
Privilege: call,all
Channel: SIP/1542200-543f
Uniqueid: 1128041150.26
Cause: 0
Cause-txt: Unknown
...
...
.
.
In this case "Event: Hangup", "Privilege: call, all", and
the rest all get passed off to my parser. Obviously a problem.
Is * spitting this data out to me in three seperate chunks or is my socket not
blocking correctly?
Any suggestions as to why this would happen?
TIA,
Joshua
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
http://lists.digium.com/pipermail/asterisk-users/attachments/20050930/ca099944/attachment.htm
I just had a thought. Is this something that I should post to the
Asterisk-Dev list? I didn't want to cross post, but I'm not sure to
which list I should have originally posted it.
Thanks,
Joshua
________________________________
From: asterisk-users-bounces@lists.digium.com
[mailto:asterisk-users-bounces@lists.digium.com] On Behalf Of Tressler,
Joshua A
Sent: Friday, September 30, 2005 11:52 AM
To: asterisk-users@lists.digium.com
Subject: [Asterisk-Users] C Manager Interface Client
List:
This is my first manager client that I've written so please bear with
me:
I am trying to write a C manager interface client to interface with our
CRM software. I am having an issue while reading the data from the
manager interface.
I am writing this in C and I have the following code:
while(1)
{
bzero(buffer,sizeof(buffer));
readCode = read(socketHandle,buffer,sizeof(buffer));
if(readCode < 0)
{
printf("ERROR READING FROM SOCKET\n");
exit(0);
}
printf("%s",buffer);
}
This prints out everything just as connecting to the telnet session
would print it out (I do the logging in elsewhere, that isn't the
problem here)
This code will read until * has nothing else for me to read from it then
print it all out and wait for some more stuff. Since * seems to print
out on 5038 in "blocks" of text read(...) will never cut off in the
middle of a block.
However, on one instance, and this is the only one we can reproduce the
results on, * puts out Event: ****** then stops, Privilege: ********,
then stops and then prints out the rest. This really screws up my
parsing as i normally parse using a tokenizer on \r\n\r\n and pass each
block off to a parsing method. I found this problem using the following
code:
while(1)
{
bzero(buffer,sizeof(buffer));
readCode = read(socketHandle,buffer,sizeof(buffer));
if(readCode < 0)
{
printf("ERROR READING FROM SOCKET\n");
exit(0);
}
printf("%s\n",buffer); ////////This is the main difference \n
}
In this case I get output as follows:
...
...
.
.
Event: Hangup
Privilege: call,all
Channel: SIP/1542200-543f
Uniqueid: 1128041150.26
Cause: 0
Cause-txt: Unknown
...
...
.
.
In this case "Event: Hangup", "Privilege: call, all", and
the rest all
get passed off to my parser. Obviously a problem.
Is * spitting this data out to me in three seperate chunks or is my
socket not blocking correctly?
Any suggestions as to why this would happen?
TIA,
Joshua
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
http://lists.digium.com/pipermail/asterisk-users/attachments/20051001/e45d6eac/attachment.htm
On Fri, Sep 30, 2005 at 11:51:48AM -0500, Tressler, Joshua A wrote:> List: > > This is my first manager client that I've written so please bear with me: > > I am trying to write a C manager interface client to interface with our CRM software. I am having an issue while reading the data from the manager interface. > > I am writing this in C and I have the following code: > while(1) > { > bzero(buffer,sizeof(buffer)); > readCode = read(socketHandle,buffer,sizeof(buffer)); > if(readCode < 0) > { > printf("ERROR READING FROM SOCKET\n"); > exit(0); > } > printf("%s",buffer); > }This is just the main loop, right? There has to be a login before that. Could you please post your full code? (that is: a minimal version of it that you verified to still be problematic).> > This prints out everything just as connecting to the telnet session would print it out (I do the logging in elsewhere, that isn't the problem here) > > This code will read until * has nothing else for me to read from it > then print it all out and wait for some more stuff. Since * seems to > print out on 5038 in "blocks" of text read(...) will never cut off in > the middle of a block.Using a C-based program to debug that is not very helpful. telnet localhost 5038 and see what happens in real-time. A sniffer could also help.> However, on one instance, and this is the only one we can reproduce the > results on, * puts out Event: ****** then stops, Privilege: ********, > then stops and then prints out the rest. This really screws up my > parsing as i normally parse using a tokenizer on \r\n\r\n and pass each > block off to a parsing method. I found this problem using the following code: > while(1) > { > bzero(buffer,sizeof(buffer)); > readCode = read(socketHandle,buffer,sizeof(buffer)); > if(readCode < 0) > { > printf("ERROR READING FROM SOCKET\n"); > exit(0); > } > printf("%s\n",buffer); ////////This is the main difference \n > } > In this case I get output as follows: > ... > ... > . > . > Event: Hangup > > Privilege: call,all > > Channel: SIP/1542200-543f > Uniqueid: 1128041150.26 > Cause: 0 > Cause-txt: Unknown > ... > ... > . > . > In this case "Event: Hangup", "Privilege: call, all", and the rest all get passed off to my parser. Obviously a problem. > > Is * spitting this data out to me in three seperate chunks or is my socket not blocking correctly? > > Any suggestions as to why this would happen? > > TIA, > > Joshua> _______________________________________________ > --Bandwidth and Colocation sponsored by Easynews.com -- > > Asterisk-Users mailing list > Asterisk-Users@lists.digium.com > http://lists.digium.com/mailman/listinfo/asterisk-users > To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-users-- Tzafrir Cohen | tzafrir@jbr.cohens.org.il | VIM is http://tzafrir.org.il | | a Mutt's tzafrir@cohens.org.il | | best ICQ# 16849755 | | friend
When we pull up a telnet session beside this code, the telnet sessions
shows everything in blocks together. We insert lines between socket
reads, therefore we see
Event: *****
Privilege: ******
Instead of
Event: *****
Privilege: ******
Below is the code that we have. We are getting ready to run a sniffer
and see if/why asterisk is doing the writes separately instead of in one
chunk.
Joshua
======================
char * echo = "localhost";
int port = 5038;
int readCode = 0;
struct sockaddr_in serverAddr, cliAddr;
struct hostent *server;
socketHandle = socket(AF_INET,SOCK_STREAM,0);
if(socketHandle < 0)
{
printf("ERROR OPENING SOCKET\n");
exit(0);
}
server = gethostbyname(echo);
if(server == NULL)
{
printf("ERROR NO SUCH HOST\n");
exit(0);
}
bzero((char*) &serverAddr, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
bcopy((char*)server->h_addr, (char*)&serverAddr.sin_addr.s_addr,
server->h_length);
serverAddr.sin_port = htons(port);
if(connect(socketHandle,(struct sockaddr
*)&serverAddr,sizeof(serverAddr)) < 0)
{
printf("ERROR CONNECTING\n");
exit(0);
}
readCode = read(socketHandle,buffer,sizeof(buffer));
if(readCode < 0)
{
printf("ERROR READING FROM SOCKET\n");
exit(0);
}
bzero(buffer,sizeof(buffer));
strcpy(buffer,"Action: Login\r\nUsername: username\r\nSecret:
secret\r\nEvents: on\r\n\r\n");
readCode = write(socketHandle,buffer,strlen(buffer));
if(readCode < 0)
{
printf("ERROR WRITING TO SOCKET\n");
exit(0);
}
while(1)
{
bzero(buffer,sizeof(buffer));
readCode = read(socketHandle,buffer,sizeof(buffer));
if(readCode < 0)
{
printf("ERROR READING FROM SOCKET\n");
exit(0);
}
printf("%s",buffer);
}
======================
-----Original Message-----
From: asterisk-users-bounces@lists.digium.com
[mailto:asterisk-users-bounces@lists.digium.com] On Behalf Of Tzafrir
Cohen
Sent: Saturday, October 01, 2005 10:19 AM
To: asterisk-users@lists.digium.com
Subject: Re: [Asterisk-Users] C Manager Interface Client
On Fri, Sep 30, 2005 at 11:51:48AM -0500, Tressler, Joshua A
wrote:> List:
>
> This is my first manager client that I've written so please bear with
me:>
> I am trying to write a C manager interface client to interface with
our CRM software. I am having an issue while reading the data from the
manager interface.>
> I am writing this in C and I have the following code:
> while(1)
> {
> bzero(buffer,sizeof(buffer));
> readCode = read(socketHandle,buffer,sizeof(buffer));
> if(readCode < 0)
> {
> printf("ERROR READING FROM SOCKET\n");
> exit(0);
> }
> printf("%s",buffer);
> }
This is just the main loop, right? There has to be a login before that.
Could you please post your full code? (that is: a minimal version of it
that you verified to still be problematic).
>
> This prints out everything just as connecting to the telnet session
would print it out (I do the logging in elsewhere, that isn't the
problem here)>
> This code will read until * has nothing else for me to read from it
> then print it all out and wait for some more stuff. Since * seems to
> print out on 5038 in "blocks" of text read(...) will never cut
off in
> the middle of a block.
Using a C-based program to debug that is not very helpful. telnet
localhost 5038 and see what happens in real-time.
A sniffer could also help.
> However, on one instance, and this is the only one we can reproduce
the > results on, * puts out Event: ****** then stops, Privilege: ********,
> then stops and then prints out the rest. This really screws up my
> parsing as i normally parse using a tokenizer on \r\n\r\n and pass
each > block off to a parsing method. I found this problem using the
following code:> while(1)
> {
> bzero(buffer,sizeof(buffer));
> readCode = read(socketHandle,buffer,sizeof(buffer));
> if(readCode < 0)
> {
> printf("ERROR READING FROM SOCKET\n");
> exit(0);
> }
> printf("%s\n",buffer); ////////This is the main difference \n
> }
> In this case I get output as follows:
> ...
> ...
> .
> .
> Event: Hangup
>
> Privilege: call,all
>
> Channel: SIP/1542200-543f
> Uniqueid: 1128041150.26
> Cause: 0
> Cause-txt: Unknown
> ...
> ...
> .
> .
> In this case "Event: Hangup", "Privilege: call, all",
and the rest all
get passed off to my parser. Obviously a problem.>
> Is * spitting this data out to me in three seperate chunks or is my
socket not blocking correctly?>
> Any suggestions as to why this would happen?
>
> TIA,
>
> Joshua
> _______________________________________________
> --Bandwidth and Colocation sponsored by Easynews.com --
>
> Asterisk-Users mailing list
> Asterisk-Users@lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-users
> To UNSUBSCRIBE or update options visit:
> http://lists.digium.com/mailman/listinfo/asterisk-users
--
Tzafrir Cohen | tzafrir@jbr.cohens.org.il | VIM is
http://tzafrir.org.il | | a Mutt's
tzafrir@cohens.org.il | | best
ICQ# 16849755 | | friend
_______________________________________________
--Bandwidth and Colocation sponsored by Easynews.com --
Asterisk-Users mailing list
Asterisk-Users@lists.digium.com
http://lists.digium.com/mailman/listinfo/asterisk-users
To UNSUBSCRIBE or update options visit:
http://lists.digium.com/mailman/listinfo/asterisk-users
> Below is the code that we have. We are getting ready to run a sniffer > and see if/why asterisk is doing the writes separately instead of in one > chunk.There were some changes in CVS that appear to address this issue. However, if you are trusting the manager to write full events for your application to work, then expect it to break when the manager does (and I warranty you that it will eventually happen, as the manager protocol does not mandate that the events should be written by whole chunks). You should make your application resilient to those changes, or to work even with partial writes. Regards, -- Nicol?s Gudi?o Buenos Aires - Argentina