-1

我正在接收来自客户端的消息,对其进行比较并根据比较结果发送消息。服务器发送消息(显然),但客户端停留在读取过程中。

服务器:

等待传入连接...按 Ctrl+C 结束服务器

从 127.0.0.1 连接,端口 54918 收到消息:c 随机 es 5 进入 IFs 1er IF

void
result(int sockfd)
{
    ssize_t     n;
    char        buf[MAXLINE];
    int         temp;
    time_t      ticks;
    int         i;
again:
    while ((n =read(sockfd, buf, MAXLINE)> 0))
    {
     buf[n] = '\0';
     printf("Message Recieved:%s\n",buf);
     srand (time(NULL));
     temp = rand() % 15+1;
     printf("Ramdom es %i\n",temp);
     printf("Into IF\n");    
     if ((strncmp (buf,"A",1) == 0) || (strncmp (buf,"a",1) == 0))
     {
      snprintf(buf, sizeof(buf), "Option A chosen times %i on on %.24s\r\n", temp,ctime(&ticks));
      Writen(sockfd, buf, n);
      printf("1st IF\n");
     }
     else if ((strncmp (buf,"B",1) == 0) || (strncmp (buf,"b",1) == 0))
     {
      snprintf(buf, sizeof(buf), "Option B chosen times %i on on %.24s\r\n", temp,ctime(&ticks));
      Writen(sockfd, buf, n);
      printf("2nd IF\n");
     }
     else
     {
       printf("Incorrect Input");
       Close(sockfd);
       break;
     }  
    }
    if (n < 0 && errno == EINTR)
    goto again;
    else if (n < 0)
        err_sys("read error");
    printf("salio de funcion result\n");    
}

int
main(int argc, char **argv)
{
    int                 listenfd, connfd;
    socklen_t           len;
    struct sockaddr_in  servaddr, cliaddr;
    char                buff[MAXLINE];
    /*char                message[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("Server is running on 127.0.0.1, 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);

    }
}

客户:

连接...本地地址为:127.0.0.1:54918 开始读取...输入选项 A 或 B:b

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 (argc != 3)
        err_quit("usage: a.out <IPaddress>");

    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("Starting read...\n");
    printf("Enter option A or B:  ");
        get_temp(stdin, sockfd);
    exit(0);
}

谢谢。

4

1 回答 1

0

停止编码并编写协议规范。规范应在字节级别指定交换什么信息以及如何交换。你现在这样做的方式,你的代码不可能是“正确的”或“错误的”,因为没有规范让它遵守或不遵守。

协议规范中要涵盖的最重要的事情是您是否有“消息”,如果有,每一方如何找到它们的开头和结尾。您可以使用关闭连接作为消息边界。您可以使用分隔符(例如零字节或换行符)作为消息边界。您可以在每条消息前面加上它的长度。

但是如果没有规范,您的服务器和客户端只能就谁做什么、何时以及如何做这件事达成一致。

于 2013-03-24T14:36:02.513 回答