2013-03-23 46 views
0

我想從客戶端向服務器發送選項。服務器必須做一些比較並將字符串發送回客戶端。我可以從客戶端接收數據,但是我的服務器在比較的時候崩潰(它通過「錯誤輸入」到達else並結束連接)。有人能告訴我我做錯了什麼嗎?如何比較客戶端在服務器C編程中發送的數據

Incorrect Inputclose error: Bad file descriptor

Program exited with code 01.

服務器:

void 
result(int sockfd) 
{ 
    ssize_t  n; 
    char  buf[MAXLINE]; 
    int   temp; 
    time_t  ticks; 
again: 
    while ((n =read(sockfd, buf, MAXLINE)> 0)) 
    { 
    temp = rand() % 22; 
    if (buf=="A\n" || buf=="a\n") 
    { 
     snprintf(buf, sizeof(buf), "You option is number is -%i, time is %.24s\r\n", temp,ctime(&ticks)); 
     Writen(sockfd, buf, n); 
    } 
    if (buf=="B\n" || buf=="f\") 
    { 
     snprintf(buf, sizeof(buf), "You option is number is -%i, time is %.24s\r\n", temp,ctime(&ticks)); 
     Writen(sockfd, buf, n); 
    } 
    else 
    { 
     printf("Incorrect Input"); 
     Close(sockfd); 
    } 
    } 
    if (n < 0 && errno == EINTR) 
    goto again; 
    else if (n < 0) 
     err_sys("read error"); 
} 

int 
main(int argc, char **argv) 
{ 
    int   listenfd, connfd; 
    socklen_t  len; 
    struct sockaddr_in servaddr, cliaddr; 
    char   buff[MAXLINE]; 
     char   recvline[MAXLINE + 1]; 

    listenfd = Socket(AF_INET, SOCK_STREAM, 0); 
    bzero(&servaddr, sizeof(servaddr)); 
    servaddr.sin_family  = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);/*----------------------------------------------------*/ 
    servaddr.sin_port  = htons(5678); 

    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); 
    Listen(listenfd, LISTENQ); 
    printf("EDMTS is running on 129.128.4.80, listening on port 5678\n"); 
    printf("\n"); 
    printf("Waiting for incoming connections...Press Ctrl+C to end server\n"); 

    for (; ;) 
     { 
     len = sizeof(cliaddr); 
     connfd = Accept(listenfd, (SA *) &cliaddr, &len); 

     /*Client connects to server*/ 
     printf("\n"); 
     printf("Connection from %s, port %d\n", 
       Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)), 
       ntohs(cliaddr.sin_port)); 

       result(connfd); 
       Close(connfd); 
     printf("Conexion cerrada...Esperando siguiente cliente\n"); 
     } 
} 

客戶

void 
get_temp(FILE *fp, int sock) 
{ 
    char sendline[MAXLINE], recvline[MAXLINE]; 

    while (Fgets(sendline, MAXLINE, fp) != NULL) { 

     Writen(sock, sendline, strlen(sendline)); 

     if (Readline(sock, recvline, MAXLINE) == 0) 
      err_quit("Server Terminated Prematurely"); 

     Fputs(recvline, stdout); 
    } 
} 


int 
main(int argc, char **argv) 
{ 
    int     sockfd, n; 
    socklen_t   len; 
    char    recvline[MAXLINE + 1]; 
    struct sockaddr_in servaddr, cliaddr; 
    char scale[2]; 

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
     err_sys("socket error"); 

    bzero(&servaddr, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(atoi(argv[2])); 
    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) 
     err_quit("inet_pton error for %s", argv[1]); 

    printf("Connect...\n"); 
    if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0) 
     err_sys("connect error"); 

    len = sizeof(cliaddr); 
    Getsockname(sockfd, (SA *) &cliaddr, &len); 
    printf("Local Address is: %s\n", 
      Sock_ntop((SA *) &cliaddr, sizeof(cliaddr))); 

    printf("Enter option A or B): "); 
    get_temp(stdin, sockfd); 

    exit(0); 
} 

當我運行調試,找出我的變量,我發現:

Breakpoint 1, result (sockfd=7) at servertest.c:236 236
printf("Random es %i\n",temp); (gdb) p buf $1 = "A\n", '\0' , "\203\217��", '\0' , "h\206��h\206��\204\210������#���\000\000\000\000�\206����߷\020\207��#���", '\0' , "������������\000\000\000\000\000\000\000\000�\017��", '\0' , "h\206��", '\0' , "\001\000\000\000\000\000\000\000�\207��", '\0' , "����\t\000\000\000#���\030���\000\000\000\000h\206��\003", '\0' , "\n\000\000\000g\206��", '\0' , " "... (gdb) p temp $2 = 17

非常感謝您

回答

1

首先,你不能比較使用==(你會比較指針不會忽略C字符串與Buf的地址[0]和你的靜態字符串「A \ N」的地址肯定是不相等的。爲了比較字符串,使用strncmp()

你的崩潰是因爲你調用後關閉(),讀()函數再次呼籲套接字文件描述符。要刪除崩潰,請輸入break; Close()之後如下所示:

else 
{ 
    printf("Incorrect Input"); 
    Close(sockfd); 
    break; 
} 
0

此外,您關閉了兩次插座。首先在這裏:

// void result(int sockfd) 
else 
{ 
    printf("Incorrect Input"); 
    Close(sockfd); // <<< 
} 

然後在這裏:

// int main(int argc, char **argv) 
Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)), 
ntohs(cliaddr.sin_port)); 

result(connfd); 
Close(connfd); // <<< 
printf("Conexion cerrada...Esperando siguiente cliente\n"); 
相關問題