使客户端不断响应来自服务器的消息

时间:2011-04-24 12:00:42

标签: c client-server

我正在编写一个简单的客户端/服务器应用程序,并且无法让客户端不断响应(此时,回显)发送给它的消息。

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 accepting");
    }

    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();
    }
}

这里有什么问题?

2 个答案:

答案 0 :(得分:2)

我认为你在这里混淆了服务器和客户端。通常,服务器会侦听端口并等待消息然后响应它们。 此外,如果在每次迭代中关闭连接,或者不关闭连接,则accept()需要成为循环的一部分。

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

答案 1 :(得分:1)

这里有更多错误,但我马上做了这个:

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

有点想知道当没有读过的东西时,那些写的是......

相关问题