我正在使用套接字处理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;后,它仍然在客户端切断。如果有人知道如何从服务器端的客户端解决这个问题,我将不胜感激。
答案 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);