2010-11-09 3 views
1

Я пишу telnet-сервер и клиентский код telnet, но получаю ошибку сегментации. Я пытался, но я не могу найти любой solution.Could помочь мне я работаю на Ubuntu LinuxTelnet server & client code in 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

Можете ли вы отформатировать код немного чище, пожалуйста? В редакторе есть кнопка для нее. – Flexo

+0

Также вы попытались запустить gdb/valgrind или какой-нибудь другой отладчик? – Flexo

+0

Вы действительно не хотите использовать int new; - COUGHCPLUSPLUSCOUGH – 2013-04-25 15:28:52

ответ

0

Вам необходимо запустить программу с аргументом, который будет сокет для прослушивания. Использование atoi

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

не проверяет, является ли или нет ARGV [1] существует.

+0

привет спасибо, я попробую – nishu

1

Проблема, когда вы nul-terminate data перед ее печатью.

Если data_len является MAX_DATA, то вы будете писать закрывающий '\0' характер от конца data массива.

Вместо того, чтобы пытаться NUL-прекратить массив данных, просто используйте символ формата * сказать printf, сколько символов для печати:

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

Почему мы используем int new; если вы используете C++ компилятор новый это ключевое слово и оператор для создания объекта данных, как в вашем коде, он показывает новое как ключевое слово с синим цветом.