C 客户端如何使用套接字同时发送和接收消息?

C 客户端如何使用套接字同时发送和接收消息?,c,multithreading,sockets,chat,C,Multithreading,Sockets,Chat,我创建了一个有客户端和服务器的聊天室,一切正常。但我在印刷方面有问题。问题是,客户端可以同时编写自己的消息和读取来自其他客户端的消息。所以我用一根线同时做这两件事。它可以工作,但请看一个例子,问题是什么: 这里我开始写我的第一条消息这里是收到的消息,它打断了我的写,我继续写 我不知道这是否清楚:我开始写一条消息,但我还没有发送它,因为它还没有结束,但同时收到一条消息,所以它会在我开始写消息后打印,然后我可以继续写 你知道如何解决这个问题吗 以下是客户端代码: void getMessage(ch

我创建了一个有客户端和服务器的聊天室,一切正常。但我在印刷方面有问题。问题是,客户端可以同时编写自己的消息和读取来自其他客户端的消息。所以我用一根线同时做这两件事。它可以工作,但请看一个例子,问题是什么:

这里我开始写我的第一条消息这里是收到的消息,它打断了我的写,我继续写

我不知道这是否清楚:我开始写一条消息,但我还没有发送它,因为它还没有结束,但同时收到一条消息,所以它会在我开始写消息后打印,然后我可以继续写

你知道如何解决这个问题吗

以下是客户端代码:

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;
} 
void getMessage(char*message){
尺寸ln=-1;
同时(ln消息_MAX-1){
printf(“>”);
fgets(消息、消息最大值、标准输入);
ln=strlen(消息)-1;
}
如果(消息[ln]='\n')
消息[ln]='\0';
}
void*thread_消息(void*arg)
{
字符*消息;
message=malloc(sizeof(char)*message_MAX);
int*sockfd=(int*)arg;
而(1){
getMessage(消息);
如果(发送(*sockfd,message,strlen(message),0)=-1){
perror(“客户:发送消息”);
}
}
pthread_exit(NULL);
}
int main(int argc,char*argv[])
{
int sockfd,numbytes;
在其地址中的结构sockaddr\u;
//连接器的地址信息
结构宿主*he;
char buf[消息最大值+伪最大值];
// ...
}
而第(1)款{
if((numbytes=recv(sockfd,buf,MESSAGE_MAX+PSEUDO_MAX,0))=-1){
perror(“客户:recv”);
返回退出失败;
}
// ...
字符*消息;
message=malloc(sizeof(char)*message_MAX);
//在这里,我启动线程来编写消息
pthread\u t线程;
if(pthread_create(&thread,NULL,thread_message,&sockfd)){
perror(“pthread_create”);
返回退出失败;
}
}
//我在这里打印我收到的信息
其他的
{
buf[numbytes]='\0';
printf(“%s”,buf);
}
}
关闭(sockfd);
返回退出成功;
} 

谢谢你的帮助!:)

首先,我认为你的头衔与你的问题不符。你想知道用线打印,对吗?第二,试着更详细地解释每一条信息来自哪里,以及你在哪里感到困惑

尽管如此,我相信您的问题是线程同步

  • 线程如何工作?以一种非常简单的方式,每个线程都将 有一个要执行的时间片,然后,它将为其他时间片提供空间 要执行的程序中的线程。这就是为什么必须使用互斥体 访问共享变量,使线程不使用旧值或 覆盖数据
  • 但是如何一致地打印?嗯,你可以用信号灯。检查另一个stackoverflow。在谷歌上查看C语言的例子,但这篇文章为你提供了解决这个问题的基本知识

:)

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


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

为什么要将收到的消息打印到本地客户端键入的消息的相同缓冲区/位置?因为有许多客户端。因此,其他消息来自其他客户端,必须打印:这是客户端之间的聊天。在典型的聊天应用程序中,收到的消息和已发送的消息会打印到主聊天区,而本地用户键入的消息会打印到不同的文本框中。你是怎么处理的?我想这就是我想要的。谢谢,我会试试的。