【问题标题】:Two way socket communication两路套接字通信
【发布时间】:2015-11-26 00:19:50
【问题描述】:

我正在尝试使用 C 编写一个简单的双向套接字通信。到目前为止,我的 client.c 文件的主 while 循环如下所示:

while ( gets(str) != NULL ) {
sSize = send(s, str, strlen(str), 0);
if ( len != strlen(str) ) {
  exit(1);
}

else {
   rSize  =  recv(s, buffer, 64, 0);
   buf[rSize] = '\0';
   printf("%s\n", buffer);
 }
}

sever.c 中的 while 循环如下所示:

while ( 1 ) {
gets(str);
send(p, str, strlen(str), 0);

  rSize = recv(p, buffer, 32, 0);   
  if ( rSize < 0 ) {
    exit(1);
  }
 buf[len] = '\0';
  else{
    printf("%s\n", buffer);
  }
}

程序编译正常,我可以在两台机器之间建立连接,但是当我从客户端或服务器发送消息时,我得到一个异常:

从客户端发送消息'hi'

客户端 -------------- 服务器
你好

如果我去服务器发送“你”消息,我会得到:

客户端 -------------- 服务器
你好
                                  你
你好

不确定这是怎么回事,但我想要实现的是,无论何时从客户端或服务器发送消息,它都应立即显示在另一端。

【问题讨论】:

  • 您应该说明您的预期以及为什么这不是您的预期。在我看来,您的程序正在做它应该做的事情。每一方输入一条消息,然后双方交换消息。
  • 如果recv() 返回零,您应该停止从套接字读取,关闭它,然后去做其他事情,或者退出。对等方已断开连接。
  • 请注意,数据远比代码重要,而且更难正确处理。您没有发布 str、len、buffer 等项目的声明。问题示例:除非您向我们展示,否则我们如何知道您的缓冲区至少为 65 长?

标签: c sockets networking


【解决方案1】:

请注意,gets() 是一个阻塞函数。最初客户端和服务器都被阻塞在gets() 中等待输入。当您在客户端上键入“hi”时,它会将其发送到仍然在获取时被阻止的服务器。

发送 hi 后,客户端阻塞 recv() 调用,等待来自服务器的消息。另一方面,服务器还没有收到客户端发送的'hi'消息。

当您在服务器上键入“you”时,它会从gets() 中出来并将“you”发送给客户端。之后,服务器调用 recv() 并读取客户端发送的“hi”。由于客户端已经在 recv() 中等待,它读取服务器发送的“你”。

因此,该程序完全按照其实施方式运行。请提及您的目标,不知道您想要实现什么。

【讨论】:

猜你喜欢
  • 2014-01-27
  • 2021-11-08
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多