libwchnet.a库文件有bug,没源文件不能修改都不知道要怎样处理

经测试发现,MCU同时开1个TCP服务端(端口号:1111)和1个TCP客户端(端口号:2222),服务IP(PC端)都是192.168.3.100

此时电脑只开1个客户端的软件与MCU的TCP服务端(1111)连接,MCU的客户端(2222)因为没有连接,所以每200mS超时后,

本地端口号+1重新建立连接,这时只要在电脑软件上反复几次连接/断开MCU的服务端(端口号:1111),这时很大几率会发生MCU客户端(端口号:2222)对应打印出来"TCP Connect Success",而且不会再每200mS重新连接,换句话说,电脑端要连的是服务端的1111,这时却被客户端的2222认为连接成功了,libwchnet.a库又不开放,想改也无从改起


您好,您的大致试用方式这边稍有了解,希望提供MCU端和PC端全部的IP和端口信息,以及验证的流程及状态,避免双方信息理解上的误差

正常情况下MCU的TCP_Cleint的socket在没连上服务器前不会显示连接成功,并且您电脑端也没有开启TCP服务器。


MCU的IP:192.168.3.150

MCU服务端口:1111,服务IP:192.168.3.100

MCU客户端口:2222,服务IP:192.168.3.100

电脑客户端软件IP:192.168.3.100,远程端口:1111

这个配置是可以跟MCU的服务端能通信的,只是反复断开/连接的话,MCU的客户端就认为已连接,基本上断开/连接几次就会客户端认为已建立连接,但实际上电脑软件不可能跟客户端建立连接


您好,请问您是如何判断,产生TCP连接中断的是TCP_Client产生,如果您是通过Socket的话,这个是不太准确的,因为协议栈内部,当Tcp_client对应的socket多次连接都无法连接上服务器时,这个socket会被释放掉,然后您tcp-server如果这时有新的客户端连接进来,就会占用这个socket。


tcp客户端如果连不上,会发生超时,但当打印已经连接成功信息后就没有超是了,而且连接的sock索引号就是客户端的索引号,因为打开只有2个sock,不是客户端就是服务端,如果能跟软件连上的是服务端,那么是可以通信的,然而打印信息显示连接成功,但电脑软件却没有连接


您好,307的网络库,作为tcp客户端的时候,是不会不停的发送连接请求包的,当里调用创建Socket函数后,会发送一定次数的链接请求包(重传包),如果连不上,就会发送超时中断,此时,如果有TCP-server多链接模式下,客户端链接,就会占用这个socket,提示链接成功。


这好像也不合理,如果是服务端与电脑建立连接,那为什么电脑端并没有连接成功呢?而且如果这么做你让程序员怎么知道明明配置的是客户端,后来就变成了与服务端通信的sock呢?客户端链不上也不应该把端口释放啊,发生超时就好了,如果按库这么操作,哪里还分得出这个sock是什么功能呢?


您好,客户端timeout后,需要重新创建socket,调用创建函数时会重新分配socketid,把这个socketid就是这个客户端的I'd,记录下来就好了。


@TECH10

请问当发生打印"TCP Connect Success"时能确定这个socket是原来的客户端,还是释放端口后被重新分配的外链端口呢?因为只有sock的id,我怎么知道这个socket已经被重新分配了呢?顺便说一句,如果服务端的话,它可能会有多连接,所以动态分配端口这个没有异议,但是本地的TCP客户端并不可能有多个连接,为什么要库自动释放这个socket又重新分配呢?连接不上的话为什么不能让用户使用原来的socket重新建立连接呢?譬如本地的TCP客户端要使用比较大的接收发送缓冲4096字节,然后其他只用200字节,这个时候把原来分配给客户端的socket重新分配给外链的端口,那绑定的缓冲怎么办?要重新分配给本地客户端的缓冲就变成200字节了,这样造成一个缓冲过剩,一个不够缓冲,如果把所有的缓冲都改4096的话,就实在太浪费资源了,而且内存使用起来也不一定够


还有TCP服务端为什么不能像UDP服务端那样,使用回调函数指针呢(TmpSocketInf.AppCallBack = WCHNET_UdpServerRecv)

那样的话就可以知道接入的端口IP地址了,现在的只有sockid有什么用?除了只接一个外部链接的情况以外,例如:有一个IP:192.168.3.101:1111首先接入(库分配的sockid=3),然后IP:192.168.3.102:1111接入(库分配的sockid=4),然后IP:192.168.3.101:1111的socket断开,即sockid=3被释放了,此时IP:192.168.3.102:1111断开后,立即重新接入,然后IP:192.168.3.101:1111再接入,那么最后的结果是sockid=3是IP:192.168.3.102:1111,sockid=4的是IP:192.168.3.101:1111,sockid对应接入的IP顺序就反了,如果IP:192.168.3.101的数据转串口1,192.168.3.102的数据转串口2,这个时候所有的数据都不对了


只有登录才能回复,可以选择微信账号登录