Assolutamente perfetto.
Riguardo la scelta invece del numero di porta sul client, ho utilizzato la bind anche nell'applicazione client, modificandola in questo modo (vedi grassetto):
codice:
client_mod1.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#define MAXBUF 200
#define SERVPORT 7777
int main(int argc,char *argv[])
{
char buf[MAXBUF];
hostent* hp;
sockaddr_in sin;
int sock;
if (argc!=2)
{
fprintf(stderr,"usage: ./client host\n");
exit(1);
}
hp=gethostbyname(argv[1]);
if (!hp)
{
fprintf(stderr,"client: host sconosciuto\n");
exit(1);
}
bzero((char*)&sin,sizeof(sin));
sin.sin_family=AF_INET;
bcopy(hp->h_addr,(char*)&sin.sin_addr,hp->h_length);
sin.sin_port=htons(SERVPORT);
if ((sock=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("client: errore in socket");
exit(1);
}
struct sockaddr_in sin2;
bzero((char *)&sin2,sizeof(sin2));
sin2.sin_family=AF_INET;
sin2.sin_addr.s_addr=INADDR_ANY; //in dubbio su questa riga
sin2.sin_port=htons(6000);
if (bind(s,(sockaddr*)&sin2,sizeof(sin2))<0)
{
perror("client: errore in bind");
exit(1);
}
if (connect(sock,(sockaddr*)&sin,sizeof(sin)) <0)
{
perror("client: errore in connect");
close(sock);
exit(1);
}
while (fgets(buf,sizeof(buf),stdin))
{
buf[MAXBUF-1]='\0';
send(sock,buf,strlen(buf)+1,0);
recv(sock,buf,sizeof(buf),0);
fputs(buf,stdout);
}
return 0;
}
Ero in particolare indeciso su se sin2.sin_addr.s_addr andasse inizializzato a INADDR_ANY; l'ho ricopiata dal programma server, ma non so quanto abbia senso sul client (in ogni caso, il client funziona). Secondo voi va inizializzata così? :master: