2010-11-09 104 views
1

我在寫一個telnet服務器和telnet客戶端代碼,但我得到了分段錯誤。 我試過,但我不能夠找到solution.Could誰能幫助我 我在Ubuntu Linux操作系統Telnet服務器和客戶端代碼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 2010-11-09 15:30:04

+0

你還試過運行gdb/valgrind或其他一些調試器嗎? – Flexo 2010-11-09 15:30:29

+0

你真的不想使用int new; - COUGHCPLUSPLUSCOUGH – 2013-04-25 15:28:52

回答

0

你需要用一個參數,將插座上偵聽運行該程序的工作。 您使用的atoi

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

的不檢查是否而非argv [1]存在。

+0

嗨,謝謝你,我會嘗試 – nishu 2010-11-09 15:40:20

1

問題是當你打印它之前你終止data

如果data_lenMAX_DATA,那麼您將寫下data數組末尾的'\0'字符。

而不是試圖NUL,終止數據陣列,只需使用*格式字符告訴printf多少個字符打印:

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

爲什麼我們使用int new;,如果你使用的是C++編譯器的新是關鍵字和運算符,用於在代碼中創建數據對象,並以藍色顯示新的關鍵字。