2010-04-15 7 views
0

tous. J'ai un petit problème avec le programme du serveur client. J'ai deux types différents de clients essayant de se connecter à un serveur, l'un est juste plus barebone que l'autre avec moins de choses à faire. Mais autrement, ils sont pratiquement les mêmes. Alors que le code barebone peut se connecter au serveur et le serveur l'accepte bien, la version élaborée de celui-ci ne peut pas. Le client dit qu'il est connecté, envoie des messages (via send() et sendto()) et obtient le nombre d'octets renvoyés. Mais le serveur ne le reconnaît pas. Je ne suis pas vraiment sûr pourquoi, en comparant les deux versions de clients, ils sont vraiment la même chose (au moins jusqu'à ce que connect() soit appelé), la version élaborée a bind() alors que la version barebone ne le fait pas. Quelqu'un peut-il voir un problème pourquoi ces codes très similaires ne fonctionnent pas similaires: PProblème Client Server avec connect() ou accept()

if (argc == 3) 
{ 
    host = argv[1];   // server address 
    info.c_name = argv[2]; 
} 
else 
{ 
    printf("plz read the manual, kthxbai\n"); 
    exit(1); 
} 

hp = gethostbyname(host); 
if (!hp) 
    exit(1); 
printf("host found\n"); 

// setting up address and port structure information 
bzero((char *) &server_address, sizeof(server_address)); 
server_address.sin_family = AF_INET; 
server_address.sin_addr.s_addr = htonl(INADDR_ANY); 
server_address.sin_port = htons(SERVER_PORT); 


// opening up socket 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd < 0) 
    exit(1); 
else 
    printf("socket is opened: %i \n", sockfd); 
info.sock_fd = sockfd; 


// binding socket to a port: not in barebone version 
rv = bind(sockfd, (struct sockaddr *) &server_address, sizeof(server_address)); 
if (rv < 0) 
{ 
    printf("MAIN: ERROR bind() %s\n", strerror(errno)); 
    exit(1); 
} 
else 
    printf("socket is bound\n"); 

// connecting 
rv = connect(sockfd, (struct sockaddr *) &server_address, sizeof(server_address)); 
printf("rv = %i\n", rv); 
if (rv < 0) 
{ 
    printf("MAIN: ERROR connect() %i: %s\n", errno, strerror(errno)); 
    exit(1); 
} 
else 
    printf("connected\n"); 

Je ne suis même pas sûr où le problème est, que ce soit la version élaborée du client ou il est juste le serveur? Merci pour tout éclaircissement.

Répondre

1

Si le code est vraiment ce que vous utilisez, votre client se connecte (comme par magie!) À lui-même, en raison du support quelque peu obscur de Simultaneous connect de TCP.

Le problème ici est que vous n'utilisez pas du tout le gethostbyname. Vous ne devez pas non plus lier le port du serveur s'il est en cours d'exécution sur la machine locale.

+0

bien le client se bloque pour une raison quelconque connect() mais merci de me parler de bind(), à quoi pensais-je ?? (évidemment pas) –