Dipende dalle funzioni che usi per acquisire l'input da tastiera.
Se usi fgets devi eliminare il carattere di newline alla fine del buffer. Se acquisici un IP devi convertirlo nel formato opportuno, così come la porta. Le funzioni sono inet_aton e atoi.
La stringa passata ad inet_aton deve contenere un IP dotted decimal altrimenti ritorna 0. Ti posto un mio esempio (fatto su linux) in cui se inet_aton non va a buon fine, viene tentata la risoluzione del nome.
int create_TCP_socket(char *dest_addr, unsigned int port)
{
struct sockaddr_in sa;
int fd;
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd == -1)
{
perror("socket");
if(fd != 1) close(fd);
return -1;
}
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
if(inet_aton(dest_addr, &sa.sin_addr) == 0)
{
struct hostent *he;
he = gethostbyname(dest_addr);
if(!he)
{
perror("gethostbyname");
if(fd != 1) close(fd);
return -1;
}
sa.sin_addr = *(struct in_addr*) he->h_addr_list[0];
}
if(connect(fd, (struct sockaddr*) &sa, sizeof(sa)) == -1)
{
perror("connect");
if(fd != 1) close(fd);
return -1;
}
return fd;
}
Per capire bene i formati e le strutture delle socket mi è stato molto utile scrivere un API portabile windows/linux. Questa è la inet_aton portabile:
int psl_inet_aton(char *addr, unsigned long *sin_addr)
{
#ifdef WINDOWS
if((*sin_addr = inet_addr(addr)) == INADDR_NONE)
return 0;
else
return 1;
#endif
#ifdef LINUX
return inet_aton(addr, sin_addr);
#endif
}
Non so come sia la situazione lì in laboratorio. Immagino windows.