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...
精彩评论