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 withme:> > I am trying to write a C manager interface client to interface withour 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 sessionwould 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 reproducethe> 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 passeach> block off to a parsing method. I found this problem using thefollowing 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 allget passed off to my parser. Obviously a problem.> > Is * spitting this data out to me in three seperate chunks or is mysocket 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