Thread: Listener / Telnet / Ping

  1. #1
    C Beginner
    Join Date
    Dec 2011
    Location
    Portugal
    Posts
    187

    Listener / Telnet / Ping

    Hi guys,
    I'm currently trying to implement a program that if the next computer (which I know his IP) has his listener open I shall send him a banner, otherwise I'll send to the next one having his listener open.

    How can I detect if someone has his listener open ?

    Telnet / ping ?

    Thanks.

  2. #2
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,660
    > How can I detect if someone has his listener open ?
    The connect will fail or succeed.

    > Telnet / ping ?
    Ping tells you the host is alive, not whether it is open for talking.
    telnet has it's own default ports. All that would tell you is that it is listening for telnet, not necessarily listening for your banner service.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  3. #3
    C Beginner
    Join Date
    Dec 2011
    Location
    Portugal
    Posts
    187
    I've read the code I pasted from beej.us and in no way it connects to the other computer as I'm not connecting, I'm just sending info to there.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    
    
    #define SERVERPORT 8080   // the port users will be connecting to
    
    
    int main(int argc, char *argv[])
    {
        int i=2;
        int sockfd;
        struct sockaddr_in their_addr; // connector's address information
        struct hostent *he;
        int numbytes;
        char *buf=(char*)malloc(sizeof(char)*100);
        int broadcast = 1;
        //char broadcast = '1'; // if that doesn't work, try this
        
        if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
            perror("gethostbyname");
            exit(1);
        }
        
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
            perror("socket");
            exit(1);
        }
        
        // this call is what allows broadcast packets to be sent:
        if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast,
                       sizeof broadcast) == -1) {
            perror("setsockopt (SO_BROADCAST)");
            exit(1);
        }
        
        their_addr.sin_family = AF_INET;     // host byte order
        their_addr.sin_port = htons(SERVERPORT); // short, network byte order
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);
        
        
        
        
        while(argv[i]!=NULL)
        {
            strcat(buf, argv[i]);
            strcat(buf, " ");
            i++;
        }
        
        
        if ((numbytes=sendto(sockfd, buf, strlen(buf), 0,
                             (struct sockaddr *)&their_addr, sizeof their_addr)) == -1) {
            perror("sendto");
            exit(1);
        }
      
        inet_ntoa(their_addr.sin_addr);
        
        close(sockfd);
        
        return 0;
    }
    So basically what you're telling me is to use the connect function inside this code correct ?

    Thanks.

  4. #4
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,660
    sendto(2): send message on socket - Linux man page
    But you're using broadcast, so there is no connection at all.

    At the moment, you just fire off a message and hope that someone is listening.
    Maybe no address is listening, or maybe several addresses are listening.

    Now if the broadcast recipients decide to send a message back "OK, got your message", then you might be able to set up a proper connection between the two hosts.

    Oh, and your strcat in a loop needs to begin with
    *buf = '\0';
    before the loop enters.
    malloc doesn't guarantee that memory allocated is filled with zeros (or anything).
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  5. #5
    C Beginner
    Join Date
    Dec 2011
    Location
    Portugal
    Posts
    187
    Yeah, but I can broadcast a message to a specific IP.

    For example, I can do it like this :

    Code:
    ./talker 192.168.1.5 hi
    And that shall send him a message.

    I implemented this on my code :

    Code:
    if((connect(sockfd, their_addr.sin_addr.s_addr ,memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero))) == -1) {
            printf("Listener is not active \n");
        }
    But for some reason I always get that message.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Keyboard Event Listener
    By Matt Hintzke in forum C Programming
    Replies: 7
    Last Post: 12-29-2011, 09:11 AM
  2. create UDP "listener" with pthread
    By qualia in forum C Programming
    Replies: 1
    Last Post: 08-22-2010, 05:37 AM
  3. Multiple Threads, One listener.
    By PING in forum Networking/Device Communication
    Replies: 3
    Last Post: 03-27-2009, 12:19 PM
  4. Error stop Http Listener
    By George2 in forum C# Programming
    Replies: 1
    Last Post: 06-04-2008, 02:14 AM
  5. multi-threaded listener
    By XX@nnX in forum Windows Programming
    Replies: 7
    Last Post: 02-25-2006, 05:05 AM