嵌入式技术论坛
直播中

王超

7年用户 1296经验值
私信 关注
[问答]

为什么w5500创建不了SOCKET但可以ping通呢?

w5500创建不了SOCKET,可以ping通。创建SOCKET一直报。
2.jpg

回帖(6)

YYXIAO

2023-4-20 16:11:31
看报错是原来的没有关闭,无法创建的新的
举报

王超

2023-4-20 16:11:42
1.意思是没有关闭已存在SOCKET吗。问题是从初始化开始就没创建成功。断电后不能自恢复吗?
2.如果是已存在SOCKET,是否先进行关闭再打开即可。或者换个SOCKET口。
3.关闭函数,怎么知道已存在SOCKET描述符号
举报

YYXIAO

2023-4-20 16:11:53
“初始化开始就没创建成功”, 能发一下测试代码吗
举报

王超

2023-4-20 16:12:01
2.jpg
在WIN_SOCKET上创建SOCKET后进行关闭,是可以创建套接字成功,且收到一条数据,服务器再次发送,就收不到。
举报

YYXIAO

2023-4-20 16:12:09
第1次能发送,那说明没什么大问题。
TCP分短连接和长连接,短连接用完就要关闭,你应该是短连接没关闭,而硬件只支持一个socket,当然也可以长连接,长连接的话就用原来那个socket号,不需要新建。
举报

贾大林

2023-4-20 16:12:19
端口未关闭,需要检查SR寄存器的状态,然后再根据当前状态执行相应操作,不知道你是客户端还是服务器,但是原理是一样的。这里贴一下官方例程:

int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
   int32_t ret;
   uint16_t size = 0, sentsize=0;
#ifdef _LOOPBACK_DEBUG_
   uint8_t destip[4];
   uint16_t destport;
#endif
   switch(getSn_SR(sn))
   {
      case SOCK_ESTABLISHED :
         if(getSn_IR(sn) & Sn_IR_CON)
         {
#ifdef _LOOPBACK_DEBUG_
            getSn_DIPR(sn, destip);
            destport = getSn_DPORT(sn);
            printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
            setSn_IR(sn,Sn_IR_CON);
         }
         if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.
         {
            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
            ret = recv(sn, buf, size);
            if(ret <= 0) return ret;      // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
            size = (uint16_t) ret;
            sentsize = 0;
            while(size != sentsize)
            {
                ret = send(sn, buf+sentsize, size-sentsize);
                if(ret < 0)
                {
                    close(sn);
                    return ret;
                }
                sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
            }
         }
         break;
      case SOCK_CLOSE_WAIT :
#ifdef _LOOPBACK_DEBUG_
         //printf("%d:CloseWait\r\n",sn);
#endif
         if((ret = disconnect(sn)) != SOCK_OK) return ret;
#ifdef _LOOPBACK_DEBUG_
         printf("%d:Socket Closed\r\n", sn);
#endif
         break;
      case SOCK_INIT :
#ifdef _LOOPBACK_DEBUG_
         printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port);
#endif
         if( (ret = listen(sn)) != SOCK_OK) return ret;
         break;
      case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
         //printf("%d:TCP server loopback start\r\n",sn);
#endif
         if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
#ifdef _LOOPBACK_DEBUG_
         //printf("%d:Socket opened\r\n",sn);
#endif
         break;
      default:
         break;
   }
   return 1;
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分