C - 套接字聊天室 - 客户端接收连续消息

时间:2016-10-31 15:05:03

标签: c sockets

我正在使用套接字处理C语言中的客户端/服务器命令行聊天程序。除了一个问题,我已经把一切都搞得很好了。当客户端向服务器提交无效命令时,我试图发送回命令列表以通知他们如何使用该应用程序。我试图通过执行多个连续的"发送" s来执行此操作,但客户端只获取第一条消息。我发现了几个类似的问题(主要是针对Java套接字),但没有任何答案可以帮助我解决这个问题。

代码和输出

服务器端代码:

void message_self(char *msg, client_t *client) {
    send(client->sd, msg, strlen(msg) + 1, 0);
}

void commands(client_t *client) {
    message_self("Commands:\n", client);
    message_self("\tUser Login:\tlogin <username> <password\n", client);
    message_self("\tCreate User:\tnewuser <username> <password>\n", client);
    message_self("\tList Users:\twho\n", client);
    message_self("\tMessaging:\tsend all|<username> <message>\n", client);
    message_self("\tQuit Chat:\tlogout\n", client);
}

客户端(在单独的线程循环中):

if((len = recv(sd, buff_in, sizeof(buff_in), 0)) > 0) {
    fputs(buff_in, stdout);
}

输出:空白行是用户刚进入输入,因此服务器将调用命令(客户端)。只收到1行后,用户输入&#34;发送&#34;并从服务器获得相应的错误消息。

Connected. Chat Room Version 2

Commands:
send
Server: Denied. Please log in.

如果我在每个message_self之间放置usleep(50),那么我得到预期的输出:

Connected. Chat Room Version 2

Commands:
    User Login:     login <username> <password>
    Create User:    newuser <username> <password>
    List Users:     who
    Messaging:      send all|<username> <message>
    Quit Chat:      logout

我认为必须有更好的方法。我还尝试将整个列表连接到一个带有所有格式化字符的缓冲区,但是在打印&#34;命令:&#34;后,它仍然在客户端切断。如果有人知道如何从服务器端的客户端解决这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

正如@KarstenKoop评论的那样,从服务器发送空终止符会搞砸一切。相反,只需发送strlen字节并在客户端使用len来终止fput的消息。

服务器:

"device": {
  "adTrackingEnabled": true,
  "advertisingId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "manufacturer": "Apple",
  "model": "x86_64",
  "type": "ios"
},

客户端:

send(client->sd, msg, strlen(msg), 0);