【问题标题】:How can client send and receive messages at the same time with sockets?客户端如何使用套接字同时发送和接收消息?
【发布时间】: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


【解决方案1】:

解决您的问题的一种方法:也许使用来自ncursesgetch。将您已经输入的内容保存到缓冲区中。并在终端的不同行显示来自其他客户端的消息和您的输入。

注意:我以前从未使用过 libncurses,但当我看到ncursesexamples 时,我知道它可以满足聊天程序的需求。希望对您有所帮助。

【讨论】:

  • 我想这就是我想要的。谢谢,我会试试的。
【解决方案2】:

首先,我认为您的标题与您的问题不符。您想了解使用 threads 进行打印,对吗?其次,尝试更详细地解释每条消息的来源以及您感到困惑的地方。

说了这么多,相信你的问题是线程同步

  • 线程如何工作?以一种非常简化的方式,每个线程将 有一个 时间片 来执行,然后,它将为其他人提供空间 程序中要执行的线程。这就是为什么你必须使用 mutex 访问共享变量,因此线程不使用旧值或 覆盖数据。
  • 但是如何始终如一地打印?好吧,你可以使用信号量。检查另一个stackoverflow question。在 google 上查看 C 中的示例,但这篇文章为您提供了解决此问题的基本知识。

:)

【讨论】:

    猜你喜欢
    • 2019-08-25
    • 2017-09-30
    • 2015-01-16
    • 2019-07-04
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多