#include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> extern int h_errno; void error(const char *msg); int UdpSocket(int protocol) { int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == sockfd) { error(__func__); } return sockfd; } void error(const char *msg) { printf("Error Code: %d", errno); perror(msg); } int BindSocketToAddr(int sock, struct sockaddr_in *addr, int port) { int rc; if (!addr) { printf("%s: NULL pointer in addr\n", __func__); return -1; } bzero(addr, sizeof(struct sockaddr_in)); addr->sin_family = AF_INET; addr->sin_addr.s_addr = INADDR_ANY; addr->sin_port = htons(port); rc = bind(sock, (struct sockaddr *)addr, sizeof(struct sockaddr)); if (rc < 0) { perror(__func__); } return rc; } int main(int argc, char **argv) { int sockfd; struct sockaddr_in fromSockAddr; struct sockaddr_in serverSockAddr; socklen_t fromlen; char buf[1024]; char fromAddrStr[512]; int n; if (argc < 2) { printf("\n%s <PORT NUMBER>\n\n", argv[0]); exit(0); } setuid(0); printf("UDP Server\n"); sockfd = UdpSocket(0); if (sockfd > 0) { BindSocketToAddr(sockfd, &serverSockAddr, atoi(argv[1])); fromlen = sizeof(fromSockAddr); while (1) { /* wait for client to send a message */ n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&fromSockAddr, &fromlen); if (n < 0) { error("recvfrom"); break; } else { inet_ntop(fromSockAddr.sin_family, &fromSockAddr.sin_addr, fromAddrStr, sizeof(fromAddrStr)); printf("GOT msg from: %s\n", fromAddrStr); /* echo back */ n = sendto(sockfd, buf, n, 0, (struct sockaddr *)&fromSockAddr, sizeof(fromSockAddr)); if (n < 0) { error("sendto"); break; } } } } return 0; }
Sunday, February 26, 2012
Simple UDP Server
Saturday, February 4, 2012
Intro to Ruby
Just got my hands dirty with Ruby today. It's an interesting language, yet simple to learn. Unlike some other dynamic programming languages that too cryptic to learn, Ruby is easy to learn, similar to Tcl.
Here's an example of a program I tested:
The output:
Backward/descending
1: Obama
2: Bush2
3: Clinton
4: Bush1
5: Reagan
6: Carter
7: Ford
Forward/ascending
1: Ford
2: Carter
3: Reagan
4: Bush1
5: Clinton
6: Bush2
7: Obama
Here's an example of a program I tested:
#!/usr/bin/ruby presidents = ["Ford", "Carter", "Reagan", "Bush1", "Clinton", "Bush2", "Obama"] for fwd in [-1,1] if fwd == 1 print "Forward/ascending\n" dec = 0 else print "Backward/descending\n" dec = -1 end for ss in 0...presidents.length print ss+1, ": ", presidents[ss*fwd+dec], "\n"; end end
The output:
Backward/descending
1: Obama
2: Bush2
3: Clinton
4: Bush1
5: Reagan
6: Carter
7: Ford
Forward/ascending
1: Ford
2: Carter
3: Reagan
4: Bush1
5: Clinton
6: Bush2
7: Obama
Sunday, November 6, 2011
TinyXML
#include <ltinyxml.h> // ---------------------------------------------------------------------- // STDOUT dump and indenting utility functions // ---------------------------------------------------------------------- const unsigned int NUM_INDENTS_PER_SPACE=2; const char * getIndent( unsigned int numIndents ) { static const char * pINDENT=" + "; static const unsigned int LENGTH=strlen( pINDENT ); unsigned int n=numIndents*NUM_INDENTS_PER_SPACE; if ( n > LENGTH ) n = LENGTH; return &pINDENT[ LENGTH-n ]; } // same as getIndent but no "+" at the end const char * getIndentAlt( unsigned int numIndents ) { static const char * pINDENT=" "; static const unsigned int LENGTH=strlen( pINDENT ); unsigned int n=numIndents*NUM_INDENTS_PER_SPACE; if ( n > LENGTH ) n = LENGTH; return &pINDENT[ LENGTH-n ]; } int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent) { if ( !pElement ) return 0; TiXmlAttribute* pAttrib=pElement->FirstAttribute(); int i=0; int ival; double dval; const char* pIndent=getIndent(indent); printf("\n"); while (pAttrib) { printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value()); if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS) printf( " int=%d", ival); if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval); printf( "\n" ); i++; pAttrib=pAttrib->Next(); } return i; } void dump_to_stdout( TiXmlNode* pParent, unsigned int indent = 0 ) { if ( !pParent ) return; TiXmlNode* pChild; TiXmlText* pText; int t = pParent->Type(); printf( "%s", getIndent(indent)); int num; switch ( t ) { case TiXmlNode::TINYXML_DOCUMENT: printf( "Document" ); break; case TiXmlNode::TINYXML_ELEMENT: printf( "Element [%s]", pParent->Value() ); num=dump_attribs_to_stdout(pParent->ToElement(), indent+1); switch(num) { case 0: printf( " (No attributes)"); break; case 1: printf( "%s1 attribute", getIndentAlt(indent)); break; default: printf( "%s%d attributes", getIndentAlt(indent), num); break; } break; case TiXmlNode::TINYXML_COMMENT: printf( "Comment: [%s]", pParent->Value()); break; case TiXmlNode::TINYXML_UNKNOWN: printf( "Unknown" ); break; case TiXmlNode::TINYXML_TEXT: pText = pParent->ToText(); printf( "Text: [%s]", pText->Value() ); break; case TiXmlNode::TINYXML_DECLARATION: printf( "Declaration" ); break; default: break; } printf( "\n" ); for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) { dump_to_stdout( pChild, indent+1 ); } } // load the named file and dump its structure to STDOUT void dump_to_stdout(const char* pFilename) { TiXmlDocument doc(pFilename); bool loadOkay = doc.LoadFile(); if (loadOkay) { printf("\n%s:\n", pFilename); dump_to_stdout( &doc ); // defined later in the tutorial } else { printf("Failed to load file \"%s\"\n", pFilename); } } void build_simple_doc( ) { // Make xml:World TiXmlDocument doc; TiXmlDeclaration * declaration = new TiXmlDeclaration( "1.0", "UTF-8", "" ); TiXmlElement * root = new TiXmlElement( "mipsdiag" ); doc.LinkEndChild( declaration ); doc.LinkEndChild( root ); TiXmlElement * cpu = new TiXmlElement( "cpu" ); root->LinkEndChild(cpu); TiXmlComment * comment = new TiXmlComment(); comment->SetValue("-- CPU utilization --" ); cpu->LinkEndChild(comment); TiXmlElement *cpu_res = new TiXmlElement("cpu_resouce"); cpu_res->SetAttribute("type", "utilization"); cpu_res->SetAttribute("units", "percent"); cpu->LinkEndChild(cpu_res); TiXmlText *cpu_utilization = new TiXmlText("0.11"); cpu_res->LinkEndChild(cpu_utilization); dump_to_stdout( &doc ); doc.SaveFile( "mipsdiag.xml" ); } int main() { build_simple_doc(); }
Tuesday, October 18, 2011
Ooma has dialtone, but unable to make calls
There might be a bug in Old Ooma Broadband Voip device which for some reason could not establish voice connection (although it could connect to Ooma gateway and we could hear its unique dialtone).
To fix it is actually very simple, just unplug the power to it and leave it like that for about 15 seconds, and than replug it
To fix it is actually very simple, just unplug the power to it and leave it like that for about 15 seconds, and than replug it
iTunes fails to upgrade iPad with error 1611
This issue was due to SIM card.
Try remove the SIM card while doing upgrade. Once the upgrade is complete, we can reinsert the SIM card.
Try remove the SIM card while doing upgrade. Once the upgrade is complete, we can reinsert the SIM card.
Monday, September 5, 2011
Recover file name copied from iPod/iPhone
With gtkPod, we are able to connect to iPhone/iPod and copy all the files, but the filenames are all cryptic (they are all in four letters). With the following script, we can recover the file names and convert them into readable format in the form of "artist - album" pattern.
Save the above script into an executable file, say mp4fixname.
To fix a filename, just run it and pass the encoded filename.
For example, if the file name is NXJA.m4a, we just run the script as below:
mp4fixname NXJA.m4a
The original filename will be replaced in artist and song name format according to metadata/tags stored in the original file.
#!/bin/sh FULLPATH=$1 FILE=${FULLPATH##*/} FILENAME=${FILE%.*} EXT=${FILE##*.} #echo "FILENAME=$FILENAME" #echo "EXTension=$EXT" shift OPTS=$@ echo filename=$FILENAME meta=`mp4info "$FULLPATH" | awk '/Metadata / {sub(/^[ \t]+/, "")};1'` #echo meta=$meta TITLE=`echo "$meta" | awk '/Metadata Name: / {gsub(/Metadata Name: /,""); print }'` ARTIST=`echo "$meta" | awk '/Metadata Artist: / {gsub(/Metadata Artist: /,""); print }'` if [ -z "$TITLE" ] then TITLE="unknown" else echo TITLE=$TITLE fi if [ -z "$ARTIST" ] then ARTIST="unknown" else echo ARTIST=$ARTIST fi TARGET="$ARTIST - $TITLE.$EXT" cp "$FULLPATH" "$TARGET" if [ -n $ "$TARGET" ] then rm "$FULLPATH" fi
Save the above script into an executable file, say mp4fixname.
To fix a filename, just run it and pass the encoded filename.
For example, if the file name is NXJA.m4a, we just run the script as below:
mp4fixname NXJA.m4a
The original filename will be replaced in artist and song name format according to metadata/tags stored in the original file.
Subscribe to:
Posts (Atom)