2011-04-24 145 views
0

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

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

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

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

是,在我的情况下,我需要扭转角色,这样你才可以切换名称 - 我也只需要听一个客户端的请求。 – Ross 2011-04-24 12:10:51

+0

@Ross - 还好,请注意,如果您想继续发送数据,请关闭服务器回路末端的连接,否则不应关闭连接。 – MByD 2011-04-24 12:12:34

+0

啊,那就是问题所在 - 感谢您的帮助(以及其他问题)! – Ross 2011-04-24 12:14:25

1

有相当多的错在这里,但马上我应该这样做:

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

有点儿想知道这些的时候读取任何正在做写...

+0

哦,我看到了,对不起,我没有正确地考虑这一点 - 我认为读取会阻塞,直到它读取了字节。 – Ross 2011-04-24 12:13:10

+0

我不知道你是确切的环境,但在某些时候,套接字读取将超时并返回超时错误。 – Christo 2011-04-24 12:17:04

+0

有没有办法来防止(即没有超时)或更好的模式,我应该使用? – Ross 2011-04-24 12:25:05

相关问题