开发者

Making client respond continuously to messages from server

开发者 https://www.devze.com 2023-02-28 15:08 出处:网络
I\'m writing a simple client/server application and am having trouble getting the client to continuously respond to (at the moment, echo) messages sent to it.

I'm writing a simple client/server application and am having trouble getting the client to continuously respond to (at the moment, echo) messages sent to it.

client.c

#define BUF_SIZE 1024

int ctrlsockfd;

void error(const char *message);
void closeStreams();
void writeResponse(const char *message);

int main (int argc, const char *argv[]) {
    printf("Client\n");

    // Connection code snipped

    // Handle responses
    int bytes_read;
    char buffer[BUF_SIZE];
    while (1) {
        // Fetch a message
        bytes_read = read(ctrlsockfd, buffer, BUF_SIZE);

        if (bytes_read == -1) {
            error("Failed to read");
        }

        // Send it back
        if (write(ctrlsockfd, buffer, strlen(buffer) + 1) == -1) {
            error("Failed to write");
        }
    }

    // Disconnect
    closeStreams();

    return 0;
}

host.c

#define BUF_SIZE 1024
#define LISTENPORT 9735

void closeStreams();
void error(const char *message);

int ctrlsockfd, clientsockfd;

int main (int argc, const char *argv[]) {
    printf("Server\n");

    // Connection code snipped

    // Accept a request (blocking) - we can only connect to one client at a time
    clientlen = sizeof(clientaddr);
    clientsockfd = accept(ctrlsockfd, (struct sockaddr *) &clientaddr, (socklen_t*) &clientlen);
    if (clientsockfd == -1) {
        error("Error accep开发者_StackOverflow社区ting");
    }

    while (1) {
        // Read input string from stdin
        printf("> ");
        char message[BUF_SIZE];
        if (scanf("%s", message) == -1) {
            error("Failed to read from terminal");
        }

        // Send to client
        if (write(clientsockfd, message, strlen(message) + 1) == -1) {
            error("Failed to send message");
        } else {
            printf("Sent message %s\n", message);
        }

        // Read response from client
        char response[BUF_SIZE];
        if (read(clientsockfd, response, BUF_SIZE) == -1) {
            error("Error reading response");
        } else {
            printf("Response: %s\n", response);
        }

        // Close the connection
        closeStreams();
    }
}

What's the problem here?


I think you confuse server and client here. Usually the server listens to a port and waits for messages and then respond to them. Also, the accept() needs to be part of the loop if you close the connection in each iteration, or alternatively, don't close the connection.

Server       client
wait
             connect
             send data
read data
send data
             read data
<maybe iteration of send / receive here >
close        close
wait
...


There's quite a bit more wrong here, but right away I'd do this:

// Send it back
if (bytes_read > 0 && write(ctrlsockfd, buffer, strlen(buffer) + 1) == -1) {
     error("Failed to write");
} 

Kinda wonder what those writes when nothing was read were doing...

0

精彩评论

暂无评论...
验证码 换一张
取 消