2010-11-09 5 views
1

J'écris un serveur de telnet et un code de client de telnet mais j'obtiens l'erreur de segmentation. J'ai essayé, mais je ne suis pas en mesure de trouver quelqu'un solution.Could me aider je travaille sur linux ubuntuCode de serveur et de client Telnet dans c

#include<stdio.h>  
#include<stdlib.h> 
#include<sys/socket.h>  
#include<sys/types.h>  
#include<netinet/in.h>  
#include<error.h>  
#include<strings.h>  
#include<unistd.h>  
#include<arpa/inet.h>  


#define ERROR -1  
#define MAX_CLIENTS 2  
#define MAX_DATA 1024 


main(int argc, char **argv)  
{  
struct sockaddr_in server;  
struct sockaddr_in client;  
int sock;  
int new;  
int sockaddr_len = sizeof(struct sockaddr_in);  
int data_len;  
char data[MAX_DATA];  


if((sock = socket(AF_INET, SOCK_STREAM, 0)) == ERROR)  
{  
    perror("server socket: ");  
    exit(-1);  
}  

server.sin_family = AF_INET;  
server.sin_port = htons(atoi(argv[1]));  
server.sin_addr.s_addr = INADDR_ANY;  
bzero(&server.sin_zero, 8);  

if((bind(sock, (struct sockaddr *)&server, sockaddr_len)) == ERROR)  
{  
    perror("bind : ");  
    exit(-1);  
} 

if((listen(sock, MAX_CLIENTS)) == ERROR)  
{  
    perror("listen");  
    exit(-1);  
} 

while(1) // Better signal handling required  
{  
    if((new = accept(sock, (struct sockaddr *)&client, &sockaddr_len)) == ERROR)  
    {  
    perror("accept");  
    exit(-1);  
    }  


    printf("New Client connected from port no %d and IP %s\n", ntohs(client.sin_port), net_ntoa(client.sin_addr)); 

    data_len = 1;    

    while(data_len)  
    {  
    data_len = recv(new, data, MAX_DATA, 0);  

    if(data_len)  
    {  
    send(new, data, data_len, 0);  
    data[data_len] = '\0';  
    printf("Sent mesg: %s", data);  
    } 
    } 

    printf("Client disconnected\n"); 

    close(new);  

} 

close(sock);  
} 
+1

Pouvez-vous formater le code un peu plus propre s'il vous plaît? Il y a un bouton dans l'éditeur. – Flexo

+0

Avez-vous essayé d'exécuter gdb/valgrind ou un autre débogueur? – Flexo

+0

Vous ne voulez vraiment pas utiliser int new; - COUGHCPLUSPLUSCOUGH –

Répondre

0

Vous devez exécuter le programme avec un argument qui sera le socket pour écouter. Votre utilisation de atoi

server.sin_port = htons(atoi(argv[1])); 

ne vérifie pas si oui ou non argv [1] existe.

+0

salut merci je vais essayer – nishu

1

Le problème est lorsque vous terminez zéro data avant de l'imprimer.

Si data_len est MAX_DATA, alors vous écrirez le caractère '\0' fermant la fin du tableau data.

Plutôt que d'essayer de NUL à la fin du tableau de données, il suffit d'utiliser le caractère de format * dire printf combien de caractères à imprimer:

printf("Sent mesg %.*s", data_len, data); 
-1

Pourquoi nous utilisons int new; si vous utilisez compilateur C++ le nouveau est le mot-clé et l'opérateur pour créer un objet de données comme dans votre code il montre nouveau comme mot-clé avec la couleur bleue.