-
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.
-
> 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.
-
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.
-
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).
-
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.