C Board  

Go Back   C Board > General Programming Boards > Networking/Device Communication

Reply
 
LinkBack Thread Tools Display Modes
Old 03-13-2004, 12:02 AM   #1
Registered User
 
Join Date: Mar 2004
Posts: 2
Using getpeername()

Hey :-)

I'm getting into network programming and want to be able to see the hostname connected on a specified port, is this easy enough to do with getpeername() or is there another way to do it?

Here's the code I have so far, i've bolded where I wanna use the hostname:

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 <sys/wait.h>
#include <signal.h>
 
#define MYPORT 3490    // the port users will be connecting to
#define BACKLOG 10     // how many pending connections queue will hold
 
void sigchld_handler(int s) {
 while(wait(NULL) > 0);
}
 
int main() {
  int sockfd, new_fd;  // listen on sock_fd, new connection on new_fd
  struct sockaddr_in my_addr;    // my address information
  struct sockaddr_in their_addr; // connector's address information
  int sin_size;
  struct sigaction sa;
  int yes=1;
  FILE *filePointer = fopen("telnet_server.log", "a");;
  struct sockaddr *hostName_ptr;
  char hostName[128];
 
  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
  }
 
  if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
    perror("setsockopt");
    exit(1);
  }
         
  my_addr.sin_family = AF_INET;         // host byte order
  my_addr.sin_port = htons(MYPORT);     // short, network byte order
  my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
  memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct
 
  if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
    perror("bind");
    exit(1);
  }
 
  if (listen(sockfd, BACKLOG) == -1) {
    perror("listen");
    exit(1);
  }
 
  sa.sa_handler = sigchld_handler; // reap all dead processes
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = SA_RESTART;
   
  if (sigaction(SIGCHLD, &sa, NULL) == -1) {
    perror("sigaction");
    exit(1);
  }
 
  while(1) {  // main accept() loop
    sin_size = sizeof(struct sockaddr_in);
    if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
      perror("accept");
      continue;
    }
 
    fprintf(filePointer, "Server: Got connection from %s\n", inet_ntoa(their_addr.sin_addr)); 
 
      if (!fork()) { // this is the child process
      close(sockfd); // child doesn't need the listener
      if (send(new_fd, "Hello world!\n", 14, 0) == -1)
        perror("send");
        close(new_fd);
        exit(0);
      }
    close(new_fd);  // parent doesn't need this
  }
 
return 0;
}

If there is anyone that could help it be much appreciated
AMMullan is offline   Reply With Quote
Old 03-13-2004, 11:41 AM   #2
Yes, my avatar is stolen
 
anonytmouse's Avatar
 
Join Date: Dec 2002
Posts: 2,544
getpeername() returns the remote address for the socket(which you already have). I think you are looking for gethostbyaddr(). This takes an ip address and returns a hostent structure which includes the host name in h_name.

Search Google Groups for samples.

It should be noted that getting the host name requires a dns lookup and is therefore not "instant".
anonytmouse is offline   Reply With Quote
Old 03-13-2004, 04:54 PM   #3
Registered User
 
Join Date: Mar 2004
Posts: 2
Thanks heaps anonytmouse - did a GG search and found something to what I needed, changed it a bit then added it... works perfectly :-)
AMMullan is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Forum Jump


All times are GMT -6. The time now is 02:40 AM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22