gpt4 book ai didi

c - 在屏幕底部保持提示消息应用程序

转载 作者:太空宇宙 更新时间:2023-11-04 03:38:01 24 4
gpt4 key购买 nike

我正在尝试在 Mac 上用 C 语言开发 CLI 消息传递应用程序以进行网络编程练习,但我不确定如何有效地操纵命令行以使其可用。目前,提示将显示“输入消息:”,但如果在用户完成输入消息之前收到一条消息,则可能会发生以下情况:“输入一条消息:你好 wClient:我正在打断你的世界”。

我想要的解决方案是让“输入消息”提示始终位于屏幕底部,传入和传出消息从顶部向下显示,就像您在任何 Messenger 中一样,尽管我不知道如何将某些东西粘到终端底部或如何以任何方式在视觉上影响终端。

这是目前为止的全部代码:

服务器

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>

int main() {

int listenfd = 0, connfd = 0;

struct sockaddr_in serv_addr;

char sendBuff[1025];
char recvBuff[1025] = "test";

listenfd = socket(AF_INET, SOCK_STREAM, 0);

memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5000);

bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

if (listen(listenfd, 10) == -1) {
printf("Failed to listen\n");
return -1;
}

connfd = accept(listenfd, (struct sockaddr*)NULL ,NULL);

pid_t pid = fork();
if (pid) {
while (strncmp(recvBuff, "exit", 4) != 0) {
if(recv(connfd, recvBuff, sizeof(recvBuff)-1, 0) < 0)
printf("Error: Recieve\nErrno: %d\n", errno);
recvBuff[1024] = 0;

printf("Client: %s", recvBuff);
}

wait(&pid);
close(connfd);

} else {
while (strncmp(sendBuff, "exit", 4) != 0) {
fputs("Enter a message: ", stdout);
fgets(sendBuff, sizeof(sendBuff), stdin);

if(send(connfd, sendBuff, sizeof(sendBuff), 0) < 0)
printf("Error: Send\nErrno: %d\n", errno);
}
close(connfd);
exit(0);
}

close(listenfd);

return 0;

}

客户端

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

int main(void)
{
int sockfd = 0;
char recvBuff[1024];
char sendBuff[1024] = "";
struct sockaddr_in serv_addr;

memset(recvBuff, '0' ,sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Error : Could not create socket \n");
return 1;
}

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5000);
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("\n Error : Connect Failed \n");
return 1;
}

pid_t pid = fork();
if (pid) {
while (strncmp(recvBuff, "exit", 4) != 0) {
if(recv(sockfd, recvBuff, sizeof(recvBuff)-1, 0) < 0)
printf("Error: Receive\nErrno: %d\n", errno);
recvBuff[1024] = 0;

printf("Server: %s", recvBuff);
}

wait(&pid);
close(sockfd);

} else {
while (strncmp(sendBuff, "exit", 4) != 0) {
fputs("Enter a message: ", stdout);
fgets(sendBuff, sizeof(sendBuff), stdin);

if(send(sockfd, sendBuff, sizeof(sendBuff), 0) < 0)
printf("Error: Send\nErrno: %d\n", errno);
}
close(sockfd);
exit(0);
}

return 0;
}

此外,关于编码风格或网络技术的任何旁注也很受欢迎。谢谢。

最佳答案

我建议您使用名为 Ncurses 的库.它是为了创建漂亮的终端界面而不想砸碎你的键盘而制作的。您将创建 2 个窗口,一个用于服务器聊天,一个用于客户端聊天。

如果您不能使用外部库,最好的办法是使用转义码到 move the cursor .一些伪代码可能如下所示:

when server message is received
Move cursor up one
Write message
Move back down

when user enters message
print on regular line

这是一个很难处理的问题,而且是特定于平台的。所以如果可能的话,一路ncurses。

关于c - 在屏幕底部保持提示消息应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com