Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 双向套接字通信_C_Sockets_Networking - Fatal编程技术网

C 双向套接字通信

C 双向套接字通信,c,sockets,networking,C,Sockets,Networking,我正在尝试使用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",

我正在尝试使用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);
 }
}
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);
  }
}
而服务器c中的循环如下所示:

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);
 }
}
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);
  }
}
while(1){
获取(str);
发送(p,str,strlen,str,0);
rSize=recv(p,缓冲区,32,0);
if(rSize<0){
出口(1);
}
buf[len]='\0';
否则{
printf(“%s\n”,缓冲区);
}
}
程序正常编译,我可以在两台机器之间建立连接,但当我从客户端或服务器发送消息时,我发现异常:

正在从客户端发送消息“hi”

client -------------------------- server hi 客户端-----------------服务器 你好 如果我去服务器发送“您”消息,我会得到:

client -------------------------- server hi you you hi 客户端-----------------服务器 你好 你 你好 不确定这到底是怎么回事,但我试图实现的是,无论何时从客户端或服务器发送消息,它都应该立即显示在另一端。

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

发送hi后,客户机阻塞recv()调用,等待来自服务器的消息。另一方面,服务器尚未收到客户端发送的“hi”消息

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


因此,该计划的工作方式完全与它的实施方式相同。请提及您的目标,不确定您想要实现什么。

您应该说明您的期望以及为什么这不是您期望的。在我看来,你的程序正在做它应该做的事情。每一方输入一条消息,然后双方交换消息。如果
recv()
返回零,则应停止从套接字读取,关闭它,然后继续执行其他操作,或退出。对等方已断开连接。请注意,数据远比代码重要,而且更难正确获取。您没有发布str、len、buffer等项的声明。问题示例:除非您向我们展示,否则我们如何知道您的缓冲区至少有65长?我试图做的是,发送的每个消息都应该按发送时的方式传递。在这种情况下,您需要在套接字和stdin上轮询。请参阅问题-