【问题标题】:How to compare data sent by client in server C programing如何在服务器C编程中比较客户端发送的数据
【发布时间】:2013-03-23 18:40:18
【问题描述】:

我想将一个选项从客户端发送到服务器。服务器必须进行一些比较并将字符串发送回客户端。我可以从客户端接收数据,但我的服务器在比较时崩溃(它通过“错误输入”到达 else 并结束连接)。谁能告诉我我做错了什么?

不正确的输入关闭错误:错误的文件描述符

程序以代码 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);
}

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

断点 1,servertest.c:236 236 处的结果 (sockfd=7)
printf("随机 es %i\n",temp); (gdb) p buf $1 = "A\n", '\0' , "\203\217��", '\0' , "h\206...h\206...\204\210... �", '\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 温度 $2 = 17

非常感谢

【问题讨论】:

    标签: c strcmp


    【解决方案1】:

    首先,你不能用 == 比较 C 字符串(你会比较指针地址,buf[0] 的地址和你的静态字符串“a\n”的地址肯定不相等。要比较字符串,请使用strncmp()

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

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

    【讨论】:

      【解决方案2】:

      另外,您要关闭套接字两次。首先在这里:

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

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 2015-02-10
        • 2015-12-26
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多