【问题标题】:Sending various commands to server- socket programming in C在 C 中向服务器套接字编程发送各种命令
【发布时间】:2015-09-20 02:10:11
【问题描述】:

我对套接字编程非常陌生,我目前正在开发一个 TCP 程序,该程序接受来自用户的各种命令(一个是 ls-remote)。客户端将命令发送到服务器,然后根据命令是什么,服务器会采取相应的行动。对于 ls-remote,服务器从运行它的文件夹将其当前目录发送回客户端,然后客户端将它们打印给用户。这是完美的工作。但是,这应该在循环中完成,直到用户输入“退出”。这就是我的问题所在,当程序在与服务器完成工作后再次提示用户输入另一个命令时,它就不起作用(ls-remote)。我相信这是因为 close(newsockfd) 是在我的服务器代码最后完成的,但我不明白为什么我必须这样做 close(newsockfd) (或者如果我想继续向服务器发送命令,我是否应该这样做? )。此外,如果需要 close(newsockfd),我该如何解决我的问题,以便用户可以输入命令直到他们希望退出?这是我的代码: 请忽略其他命令,因为我还没有实现它们。

【问题讨论】:

  • 您在每次recv 呼叫后尝试accept 一个新客户。
  • 在for循环运行一次后,它会重新开始。首先服务器accept一个客户端,然后客户端向服务器发送一条消息,服务器接收它等等。整个事情完成后,for循环再次开始等待客户端连接,因此阻止接收任何消息。
  • 是的......这应该是你的思想发挥作用的部分。

标签: c sockets network-programming tcpclient tcpserver


【解决方案1】:

TCP 是字节流协议,而不是消息协议。您需要一个消息协议,但既没有实现也没有使用。充其量,这在某些时候可能会起作用。

n = recv(newsockfd, buffer, 255, 0); 
if(n < 0) syserr("can't receive from client"); 
else buffer[n] = '\0';
printf("SERVER GOT MESSAGE: %s\n", buffer);

您从未实现过消息协议,但您的代码希望接收消息。因此,您希望这会以某种方式通过魔术起作用。如果要发送和接收消息,则必须编写发送和接收消息的代码。 TCP 不是消息协议。

首先以字节为单位定义消息。例如,“消息是不包含换行符且以换行符结尾的字符序列”。或者,“一条消息是一个字符序列,前面是字符数,作为网络字节顺序的 16 位整数”。然后编写代码来发送和接收您定义的“消息”。

【讨论】:

  • 这应该是 TCP 编程中的第一个错误。我们如何防止新手一遍又一遍地犯同样的错误?
  • @JonathonReinhart 我们通过了一项法律,要求人们在编写使用 TCP 的软件之前必须获得许可证。获得许可证的唯一要求是能够从内存中背诵这句话并定义其中的每个术语,“TCP 是一种字节流协议,可提供可靠、有序的传递,但不保留应用程序消息边界。”
猜你喜欢
  • 2015-06-05
  • 2018-01-03
  • 2023-04-05
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多