如何在服务器C编程中比较客户端发送的数据



我想从客户端发送一个选项到服务器。服务器必须进行一些比较,并将字符串发送回客户端。我可以从客户端接收数据,但是我的服务器在比较时崩溃了(它带着"错误输入"到达else并结束连接)。有人能告诉我我哪里做错了吗?

Inputclose错误:错误的文件描述符

程序退出,代码为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=="An" || buf=="an")
     {
      snprintf(buf, sizeof(buf), "You option is number is -%i, time is %.24srn", temp,ctime(&ticks));
      Writen(sockfd, buf, n);
     }
     if (buf=="Bn" || buf=="f")
     {
      snprintf(buf, sizeof(buf), "You option is number is -%i, time is %.24srn", 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 5678n");
    printf("n");
    printf("Waiting for incoming connections...Press Ctrl+C to end servern");
    for ( ; ; )
         {
        len = sizeof(cliaddr);
        connfd = Accept(listenfd, (SA *) &cliaddr, &len);
        /*Client connects to server*/
        printf("n");
        printf("Connection from %s, port %dn",
               Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
               ntohs(cliaddr.sin_port));
                result(connfd);
                Close(connfd);
        printf("Conexion cerrada...Esperando siguiente clienten");
        }
}
客户

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: %sn",
           Sock_ntop((SA *) &cliaddr, sizeof(cliaddr))); 
    printf("Enter option A or B): ");
    get_temp(stdin, sockfd);
    exit(0);
}

当我运行调试器查找变量时,我发现:

断点1,result (sockfd=7) at servertest.c:236 236
printf("随机es %in",temp);(gdb) p但是$1 = "An", " 0 ", "203217 ", " 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 ',"0100000000000000 0000 207 ", " ","���� t 000 000 000 #��� 030��� 000 000 000 000 206�003�",' 0 ',"n000000g206","","……(gdb) p温度$2 = 17

非常感谢

首先,您不能使用==比较C字符串(您将比较指针地址,buf[0]的地址和静态字符串"an"的地址肯定不相等)。要比较字符串,请使用strncmp()。

发生崩溃是因为在调用Close()之后,在套接字文件描述符上再次调用read()函数。要消除崩溃,在Close()后面放一个break;,如下所示:

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

同样,您关闭了套接字两次。第一:

// 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 clienten");

最新更新