Thread: client server program between two programs to talk with arduino interfaced with serve

  1. #1
    Registered User
    Join Date
    Oct 2011
    Posts
    3

    client server program to talk with arduino which is interfaced to server

    hello every body

    i am recently working over a mobile robot project. here i need to send an instruction to arduino microcontroller over network. for this i had choosed client server architecture. i modified the server program to read the buffer to device file descriptor ("/dev/ttyACM0" in this case.

    i was able to compile the programs and run them. when i send a request from client to server . the server simply closes with out receiving the message.

    my working environment is
    Linux 10.10

    in order to execute the client

    $ <ur path> ./client <ip address of server > <port number of server>


    for serial_server

    $ <ur path > ./serial_server <specify a port number >

    below is the code of the programs
    client code
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h> 
    
    void error(const char *msg)
    {
        perror(msg);
        exit(0);
    }
    
    int main(int argc, char *argv[])
    {
        int sockfd, portno, n;
        struct sockaddr_in serv_addr;
        struct hostent *server;
    
        char buffer[256];
        if (argc < 3) {
           fprintf(stderr,"usage %s hostname port\n", argv[0]);
           exit(0);
        }
        portno = atoi(argv[2]);
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) 
            error("ERROR opening socket");
        server = gethostbyname(argv[1]);
        if (server == NULL) {
            fprintf(stderr,"ERROR, no such host\n");
            exit(0);
        }
        bzero((char *) &serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        bcopy((char *)server->h_addr, 
             (char *)&serv_addr.sin_addr.s_addr,
             server->h_length);
        serv_addr.sin_port = htons(portno);
        if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
            error("ERROR connecting");
        printf("Please enter the message: ");
        bzero(buffer,256);
        fgets(buffer,255,stdin);
        n = write(sockfd,buffer,strlen(buffer));
        if (n < 0) 
             error("ERROR writing to socket");
        bzero(buffer,256);
        n = read(sockfd,buffer,255);
        if (n < 0) 
             error("ERROR reading from socket");
        printf("%s\n",buffer);
        close(sockfd);
        return 0;
    }


    serial_server code
    Code:
    /* A simple server in the internet domain using TCP
       The port number is passed as an argument */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h> 
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include<errno.h>
    #include<sys/ioctl.h>
    #include<termios.h>
    #include<fcntl.h>
    #include<getopt.h>
    void error(const char *msg)
    {
        perror(msg);
        exit(1);
    }
    
    int main(int argc, char *argv[])
    {
         int sockfd, newsockfd, portno;
         socklen_t clilen;
         char buffer[256];
         struct sockaddr_in serv_addr, cli_addr;
         int n,k;
    // serial data 
         int fd;
         int baudrate = B9600;
         int rc;
         
    
         if (argc < 2) {
             fprintf(stderr,"ERROR, no port provided\n");
             exit(1);
         }
         sockfd = socket(AF_INET, SOCK_STREAM, 0);
         if (sockfd < 0) 
            error("ERROR opening socket");
         bzero((char *) &serv_addr, sizeof(serv_addr));
         portno = atoi(argv[1]);
         serv_addr.sin_family = AF_INET;
         serv_addr.sin_addr.s_addr = INADDR_ANY;
         serv_addr.sin_port = htons(portno);
         if (bind(sockfd, (struct sockaddr *) &serv_addr,
                  sizeof(serv_addr)) < 0) 
                  error("ERROR on binding");
         listen(sockfd,5);
         clilen = sizeof(cli_addr);
         newsockfd = accept(sockfd, 
                     (struct sockaddr *) &cli_addr, 
                     &clilen);
         if (newsockfd < 0) 
              error("ERROR on accept");
         bzero(buffer,256);
     // serial filedescriptor initializing ;
          fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
        if (fd == -1)  {
            perror("init_serialport: Unable to open port ");
            return -1;
    
         n = read(newsockfd,buffer,255);
         if (n < 0) error("ERROR reading from socket");
     
        k= write(fd,buffer,255);
        if(k<0)error("Unable to open the arduino ");
    
        
         
         printf("Here is the message: %s\n",buffer);
         n = write(newsockfd,"I got your message",18);
         if (n < 0) error("ERROR writing to socket");
         k= write(fd,buffer,255);
        if(k<0)error("Unable to send to the arduino ");
         close(newsockfd);
         close(sockfd);
         return 0; 
    }}
    Attached Files Attached Files
    Last edited by bha123; 11-19-2011 at 03:34 AM.

  2. #2
    spurious conceit MK27's Avatar
    Join Date
    Jul 2008
    Location
    segmentation fault
    Posts
    8,300
    Quote Originally Posted by bha123 View Post
    my working environment is
    Linux 10.10
    There's no such thing. Perhaps you mean Ubuntu 10.10, which is a specific pre-compiled distribution of the GNU/linux OS?

    i was able to compile the programs and run them. when i send a request from client to server . the server simply closes with out receiving the message.
    Because:

    Code:
    // serial filedescriptor initializing ;
          fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
        if (fd == -1)  {
            perror("init_serialport: Unable to open port ");
            return -1;
     
         n = read(newsockfd,buffer,255);
         if (n < 0) error("ERROR reading from socket");
    You left a closing brace off the error handling if (fd == -1). This would cause a compiler error, unless there was a stray closing brace later -- which perhaps you just stuck one on the end to get rid of the error?

    line 77
    Code:
    }}
    Meaning if the serial device opened successfully, that is the last thing this program does. You should compile with warnings enabled:

    gcc -Wall

    This will give you a bit of clue:

    test.c:77: warning: control reaches end of non-void function

    When there is a return statement on line 76?!? Except...hmmm. It's inside the if() block from 20 lines earlier.
    C programming resources:
    GNU C Function and Macro Index -- glibc reference manual
    The C Book -- nice online learner guide
    Current ISO draft standard
    CCAN -- new CPAN like open source library repository
    3 (different) GNU debugger tutorials: #1 -- #2 -- #3
    cpwiki -- our wiki on sourceforge

  3. #3
    Registered User
    Join Date
    Oct 2011
    Posts
    3
    thnks
    sry for the late replay

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Serve image with C++ http server
    By seaders in forum C++ Programming
    Replies: 0
    Last Post: 06-11-2008, 05:40 AM
  2. Pimpl Idiom client/serve compile/link
    By George2 in forum C++ Programming
    Replies: 12
    Last Post: 03-15-2008, 06:25 AM
  3. Client-server program
    By erictran in forum C Programming
    Replies: 3
    Last Post: 09-18-2006, 07:59 PM
  4. Server doesn't serve!
    By Queatrix in forum Networking/Device Communication
    Replies: 13
    Last Post: 08-05-2006, 05:32 PM
  5. Server client program help please.
    By XiReDDeViLiX in forum C++ Programming
    Replies: 15
    Last Post: 04-03-2002, 09:21 PM