lwip_setsockopt设置地址复用出错(lwip默认不打开,lwip_bindu也会提示端口被占用)
/* 3. 设置地址复用 */
flags = lwip_setsockopt(new_sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if (flags < 0) {NET_DEBUG_PRINT("[NET] SO_REUSEADDR failed: %s\n", strerror(errno));int opt_err = errno;// 详细错误分析switch(opt_err) {case EBADF:NET_DEBUG_PRINT("[NET] SO_REUSEADDR failed: Invalid socket (%d)\n", new_sockfd);break;case ENOTSOCK:NET_DEBUG_PRINT("[NET] SO_REUSEADDR failed: Not a socket (%d)\n", new_sockfd);break;case ENOPROTOOPT:NET_DEBUG_PRINT("[NET] SO_REUSEADDR failed: Protocol not supported\n");break;case EINVAL:NET_DEBUG_PRINT("[NET] SO_REUSEADDR failed: Invalid option value\n");break;case EFAULT:NET_DEBUG_PRINT("[NET] SO_REUSEADDR failed: Bad memory address\n");break;default:// 获取原始错误值
// int lwip_err = result;NET_DEBUG_PRINT("[NET] SO_REUSEADDR failed: Unknown error (errno=%d, lwip_err=%d)\n", opt_err, flags);}
打印出:
[NET] SO_REUSEADDR failed: Protocol not supported
解决:
在lwipopts.h 添加
/* 启用 SO_REUSEADDR 支持 */
#define SO_REUSE 1
//#define SO_REUSE_RXTOALL 1