C多机插件程序无效

时间:2016-04-01 12:34:33

标签: c sockets

我正在尝试创建一个简单的基于客户端/服务器套接字的程序。它只是一个基本的"猜数字"游戏,服务器提供一个数字,然后客户端尝试猜测数字。问题是我遇到了按预期工作的程序问题。

问题是这样的:当我启动服务器程序并生成随机数时,我尝试加载客户端程序,但在一次输入后,它们就会停止工作。输出后会停止:

Guess: 42
Buffer to be processed : <42
>
integerGuess : <42> 
String Guess : <42\n> 
Buffer to send : <42\n>

这是server.c文件代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h> /* time for randomizer*/


void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno, n;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;

    int GuessedInteger, integerRandom, serverFlagCorrect;
    char charGuess[4], answerServer[1];
    char* delimiter = "\\n";

    /** initialization of variables **/
    serverFlagCorrect = 0;

    /** generate random integer from 1 to 100 **/
    srand (time(NULL));
    integerRandom = (rand() % 100) + 1;

    printf("This is the random integer : %d \n", integerRandom);

    if (argc < 2) {
        fprintf(stderr,"ERROR, no port provided\n");
        exit(1);
    }

    // Creates the socket socket() --> endpoints of sockets
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
       error("ERROR opening socket");
    // Creates the socket socket() --> endpoints of sockets

    // assign unique new address
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);

    if (bind(sockfd, (struct sockaddr *) &serv_addr,
             sizeof(serv_addr)) < 0)
             error("ERROR on binding");
    // assign unique new address

    // wait for a connection
    listen(sockfd,5);
    // wait for a connection

    // accepts the connection
    clilen = sizeof(cli_addr);
    while (1) {
         newsockfd = accept(sockfd,
               (struct sockaddr *) &cli_addr, &clilen);
         if (newsockfd < 0)
             error("ERROR on accept");
         n = fork();
         if (n < 0)
             error("ERROR on fork");
         if (n == 0)  {
             close(sockfd);
             dostuff(newsockfd);
             exit(0);
         }
         else close(newsockfd);
     } /* end of while */
     close(sockfd);
     return 0; /* we never get here */
}


    void dostuff (int sock) {
    int GuessedInteger, integerRandom, serverFlagCorrect;
    char charGuess[4], answerServer[1];
    char* delimiter = "\\n";
    int sockfd, newsockfd, portno, n;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;

    while (serverFlagCorrect != 1)
    {

        // reads the data being received
        bzero(buffer,256);
        n = read(newsockfd,buffer,255);
        if (n < 0) error("ERROR reading from socket");
        // reads the data being received

        printf("Buffer from client: <%s>\n", buffer);
        memcpy(charGuess, buffer, sizeof(charGuess));
        printf("Message from client in charGuess: <%s>\n", charGuess);

        /* Put if statement here for error out if no \n at the end */
        int len = strlen(charGuess);
        const char *last_two = &charGuess[len-2];

        printf("Last two characters of charGuess: <%s>\n", last_two);

        if (strncmp ( last_two, delimiter, 2) )
            error (" ERROR Wrong protocol received");

        /** turn string to int for comparison **/
        GuessedInteger = atoi(charGuess);
        printf("Guessed Integer : %d \n", GuessedInteger);

        /** Server response for comparison**/
        if (GuessedInteger > integerRandom)
            memcpy(&answerServer, "Lower", sizeof(answerServer));
        else if (GuessedInteger < integerRandom)
            memcpy(&answerServer, "Higher", sizeof(answerServer));
        else if (GuessedInteger == integerRandom)
            {
                serverFlagCorrect = 1;
                memcpy(&answerServer, "Correct", sizeof(answerServer));
            }
        printf("Value of answerServer: %c\n", *answerServer);
        /** Server response for comparison**/

        // sends the answer
        n = write(newsockfd, answerServer, 1);
        if (newsockfd < 0)
            error("ERROR on accept");
        // sends the answer

        // closes what was sent
    }
    close(newsockfd);
    }

这是client.c代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[1024];

    int integerGuess, clientFlagCorrect;
    int numberOfTries;
    char charGuess[1024], answerServer[1];
    char* delimiter = "\\n";


    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }
    portno = atoi(argv[2]);

    // Creates the socket socket() --> endpoints of sockets
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");
    // Creates the socket socket() --> endpoints of sockets

    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    // connects to the service in connect()
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr,
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
        error("ERROR connecting");
    // connects to the service


    /** variables **/
    clientFlagCorrect = 0;
    numberOfTries = 0;

    while (clientFlagCorrect != 1)
    {
        numberOfTries = numberOfTries + 1;

        /** initializing vars **/
        integerGuess = 0;
        memset(charGuess, 0, sizeof(charGuess));

        // ask for the number
        printf("Guess: ");
        bzero(buffer,sizeof(buffer));
        fgets(buffer,sizeof(buffer)-1,stdin);
        printf("Buffer to process is : <%s>\n", buffer);
        // ask to see if the number is guessed

        /** string and delimeter **/
        integerGuess = atoi(buffer);
        printf("int Guess : <%d> \n", integerGuess);
        sprintf( charGuess, "%d", integerGuess);
        strcat( charGuess, delimiter);
        printf("String Guess : <%s> \n", charGuess);

        memset(buffer,0,sizeof(buffer));
        memcpy(buffer, charGuess, sizeof(charGuess));
        printf("Buffer to be sent is: : <%s>\n",buffer);
        /** process the integer to string and add a delimiter **/

        // send the string that was processed
        n = write(sockfd,buffer,strlen(buffer));
        if (n < 0)
             error("ERROR writing to socket");
        // send the string that was processed

        // reads the data being received
        bzero(buffer,256);
        n = read(sockfd,buffer,255);
        if (n < 0)
             error("ERROR reading from socket");
        // reads the data being received

        printf("Buffer received : <%s>\n",buffer);

        memcpy(&answerServer, buffer, sizeof(answerServer));
        printf ("Value of answerServer : <%c> \n", *answerServer);

        /** Client response **/
        if (strncmp ( & answerServer[0],"Lower",sizeof(answerServer)) == 0)
            printf("The number is lower \n");
        else if (strncmp ( & answerServer[0],"Higher",sizeof(answerServer)) == 0)
            printf("The number is higher \n");
        else if (strncmp ( & answerServer[0],"Correct",sizeof(answerServer)) == 0)
            {
                printf("Your guess is correct! \n");
                clientFlagCorrect = 1;
            }
        else
            error("ERROR Wrong message received");

    }

    printf ("It took you this many tries: %d \n", numberOfTries);

    printf("%s\n",buffer);

    close(sockfd);
    return 0;
}

非常感谢任何帮助。

编辑:经过一些额外的工作和&#34;调试&#34; (主要由我在各个点添加一些printf)我90%确信问题出在服务器端。我在此行之前和之后添加了printf&#39;     printf(&#34;这是随机整数:%d \ n&#34;,integerRandom); 并且发现虽然紧接在行之前的printf打印出来的很好,但是如果打印出&#34;没有检测到端口&#34错误。任何进一步的printf根本不会触发,这意味着程序甚至无法到达执行程序的主循环。

至于客户端文件,它到达了这一行:     printf(&#34;要发送的缓冲区是::&lt;%s&gt; \ n&#34;,缓冲区); 并停止(再次通过printf&#39; s)。为什么,老实说,我没有任何线索。这意味着围绕这些点存在问题,但在哪里,老实说我没有任何线索。

0 个答案:

没有答案