【发布时间】:2014-12-16 12:28:27
【问题描述】:
我创建了一个包含客户端和服务器的聊天室,一切正常。但是我有一个打印问题。问题是客户端可以同时写入他的消息并从其他客户端读取消息。所以我用一个线程同时做这两件事。它有效,但看看这个例子是什么问题:
这里我开始写我的第一个烂摊子这里是收到的消息打断了我的写作这里我继续写
我不知道是否清楚:我开始写一条消息,但我还没有发送它,因为它还没有结束,但同时收到一条消息,所以它在我的写消息开始后打印它并且以后我可以继续写了。
你知道如何解决这个问题吗?
这是客户端代码:
void getMessage(char* message) {
size_t ln = -1;
while (ln <= 0 || ln > MESSAGE_MAX-1) {
printf(">");
fgets(message, MESSAGE_MAX, stdin);
ln = strlen(message) - 1;
}
if (message[ln] == '\n')
message[ln] = '\0';
}
void *thread_message(void *arg)
{
char* message;
message = malloc (sizeof(char) * MESSAGE_MAX);
int* sockfd = (int*)arg;
while (1) {
getMessage(message);
if (send(*sockfd, message, strlen(message), 0) == -1){
perror("Client: send message");
}
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
int sockfd, numbytes;
struct sockaddr_in their_addr;
// connector's address information
struct hostent *he;
char buf[MESSAGE_MAX + PSEUDO_MAX];
// ...
}
while (1) {
if ((numbytes=recv(sockfd, buf, MESSAGE_MAX+PSEUDO_MAX, 0)) == -1) {
perror("Client: recv");
return EXIT_FAILURE;
}
// ...
char* message;
message = malloc (sizeof(char) * MESSAGE_MAX);
// Here I launch the thread to write a message
pthread_t thread;
if (pthread_create(&thread, NULL, thread_message, &sockfd)) {
perror("pthread_create");
return EXIT_FAILURE;
}
}
// Here I print the messages I receive
else
{
buf[numbytes] = '\0';
printf("%s",buf);
}
}
close(sockfd);
return EXIT_SUCCESS;
}
感谢您的帮助! :)
【问题讨论】:
-
为什么要将收到的消息打印到本地客户端正在键入的消息的相同缓冲区/位置?
-
因为客户多。所以其他消息来自其他客户端并且必须打印:这是客户端之间的聊天。
-
在典型的聊天应用程序中,收到的消息和已经发送的消息会打印到主聊天区域,而本地用户正在输入的消息会打印到不同的文本框。你是怎么处理的?
标签: c multithreading sockets chat