This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C1294NCPDT:套接字重新打开绑定失败

Guru**** 2579645 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/761204/rtos-tm4c1294ncpdt-socket-reopen-bind-failed

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

你(们)好

我的应用程序是创建双套接字服务器。

第一个套接字用于数据交换。

第二个套接字用于在连接时重新打开两个套接字、此套接字将发出重新打开标志、并直接关闭。

我使用 TCP 回显示例进行修改。

下面是 关断两个套接字、tcpworker、clientfd 的流程。

执行该流程时、将创建新的 tcpHandler、与示例相同。

if (SocketResFlag = SocketRestart)
{
SocketResFlag = SocketNonRestart;
UARTprintf ("执行重新启动过程\n");
fdOpenSession( TaskSele());

if (fdShare ((socket) clientfd)==1)
{
UARTprintf ("fdShare clientfd failed\n");
}
if (fdShare ((socket) socket_0)==1)
{
UARTprintf ("fdShare Socket _0失败\n");
}

if (fdShare ((socket) socket_1)==1)
{
UARTprintf ("fdShare Socket _1失败\n");
}

UARTprintf ("Close FD socket_clientfd\n");
fdClose ((socket) clientfd);
fdClose ((套接字) Socket 0);
fdClose ((套接字) Socket _1);
UARTprintf ("TaskDestroy WorkerHandle\n");
TaskDestroy (WorkerHandle);
UARTprintf ("TaskDestroy SocketHandle\n");
TaskDestroy(SocketHandle);
SOCKET_OPEN_Flag = 0;
fdCloseSession( TaskSele());}

问题是重新打开套接字双套接字服务器将绑定失败。

如果我的流程错误、请告诉我如何操作。

请帮我解决这个问题。

非常感谢。

艾伦

CCS 版本:6.

TI-RTOS 版本:2.16.1.14

NDK 版本:2.25.00.09

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    艾伦

    我需要更好地了解您的计划以提供帮助。

    您说的是、当客户端与服务器建立新连接时、服务器将创建两个新套接字:一个用于与客户端通信、另一个用于附加套接字。 是这样吗? 第二个插座的用途是什么? 谁将连接到第二个套接字?

    谢谢、
    ~Ramsey

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、Ramsey

    感谢您的回复。

    流程如下:

    1. MCU 启动后、将创建两个套接字服务器。 第一个用于数据交换、第二个用于重新打开两个套接字的套接字。

      (两个插槽端口不同)

    2.当其它设备(客户端)连接到第一个套接字时。

    3.如果出现任何意外问题,导致端口出现问题,客户端可以连接第二个套接字端口以触发重新打开 过程,而第二个套接字将自行关闭。

    4.当客户端触发重新打开过程时、MCU 将重新打开第一个套接字端口和第二个端口。

    我的问题出现在步骤4中,重新打开套接字服务器时,它将无法绑定。

     我是 NDK 和以太网的初学者。

    请帮助解决。

    非常感谢。

    艾伦

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    艾伦

    从您的描述中、似乎服务器正在侦听两个端口、比如端口80和端口81。 客户端将连接到端口80以进行数据交换。 如果发生错误,客户端将连接到端口81,以向服务器指示应关闭原始连接。 服务器自动关闭第二个连接。

    我是否正确理解了您的描述?

    遗憾的是、此设计存在问题。 服务器不应启动连接关闭操作,而应等待客户端启动关闭操作。

    当客户端检测到有一些错误(在上面的步骤3中)时、它只需关闭套接字即可。 关闭套接字的操作将向服务器发送一个 TCP 数据包、指示客户端已关闭其套接字。

    在服务器上,当接收到此 TCP 数据包时,tcpWorker 线程将解除阻止,并使用-1从 recv()返回。 您可以检查 errno 以查看实际错误情况。 现在,服务器可以关闭其套接字并终止工作线程。

    在客户端上、它可以建立与服务器的新连接。 当此新连接请求到达服务器时,tcpHandler 任务将从 Accept()返回,并创建一个新的 tcpWorker 任务来管理新连接。

    服务器不需要再次调用 bind ()。 在 tcpecho 示例中,您可以看到,tcpHandler 任务创建了一个套接字,然后为此套接字调用 bind ()和 listen ()一次。 对 Accept()的调用在循环中完成。 每次客户端建立新连接时、此调用都将返回。 Accept()的返回值是由栈创建的新套接字,tcpWorker 任务使用该套接字与客户端通信。 它与服务器为侦听创建的套接字不同。

    ~Ramsey

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Ramsey
    很抱歉迟到了。
    感谢您的回复。
    是的、这是我的描述。
    进一步说明。
    如果侦听中的端口80,我要重新打开插槽端口80。
    我的应用是客户端无法通过连接的端口81连接服务器、以让 MCU 重新打开套接字端口80。
    您能告诉我 socket 重新打开流详细信息吗?
    请帮帮我。
    非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Ramsey
    感谢您的回复。
    我解决了我的问题。
    使用 setsockopt 函数并设置 SO_REUSEADDR、它不会绑定失败。

    艾伦
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    艾伦

    真是个好消息。 感谢您的介绍。

    我很好奇、您是否知道客户无法连接的原因? 我想知道连接故障是否会持续发生。

    谢谢、
    ~Ramsey

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Ramsey

    由于我们在其他网络堆栈中进行测试、因此端口偶尔无法连接。
    我们不想重新启动机器、因此必须在遥控器中重新打开套接字功能。
    或者、如果客户关闭不正确、并且未发送完成包、我们只允许一个客户机连接。
    套接字服务器将不会关闭。
    在本例中、我们还需要重新打开函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    艾伦

    好的、明白了。 感谢您的告知。

    ~Ramsey