首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >closesocket()失败,并显示WSAEOPNOTSUPP

closesocket()失败,并显示WSAEOPNOTSUPP
EN

Stack Overflow用户
提问于 2009-05-18 18:07:03
回答 4查看 981关注 0票数 1

我有一个使用套接字的应用程序(这不是我写的,所以请耐心等待),当我试图关闭一个套接字时,closesocket()失败并返回错误WSAEOPNOTSUPP,并且套接字将around...as插入,它没有被完全删除。

套接字的创建方法如下:

代码语言:javascript
复制
bool Socket::CreateConnection()
{
   int error;
   struct addrinfo hints;
   struct addrinfo *list = NULL;

   memset(&hints, 0, sizeof(hints));
   hints.ai_family = AF_INET;
   hints.ai_socktype = SOCK_STREAM;
   hints.ai_protocol = IPPROTO_TCP;

   error = getaddrinfo(socketAddress.c_str(), socketPort.c_str(), &hints, &list);
   if (error)
   {
      Log().RecordError("Unable to initialize connection to server", WSAGetLastError(), EventTypeError);
   }

   for (struct addrinfo *ptr = list; ptr != NULL; ptr = ptr->ai_next)
   {
      connection = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
      if (connection == INVALID_SOCKET)
      {
         Log().RecordError("Unable to initialize socket connection", WSAGetLastError(), EventTypeError);
         break;
      }

      error = connect(connection, ptr->ai_addr, (int)ptr->ai_addrlen);
      if (error == SOCKET_ERROR)
      {
         closesocket(connection);
         connection = INVALID_SOCKET;
         continue;
      }
      break;
   }

   freeaddrinfo(list);

   return connection != INVALID_SOCKET;
}

和类的析构函数:

代码语言:javascript
复制
Socket::~Socket()
{
   int error;

   if (connection != INVALID_SOCKET)
   {
      continueReading = false;

      error = shutdown(connection, SD_SEND);
      if (error != SOCKET_ERROR)
      {
         /* Finish any necessary receives to politely close the socket */
         int length;
         do
         {
            char buffer[1024];
            length = recv(connection, buffer, sizeof(buffer)/sizeof(*buffer), MSG_WAITALL);
         } while (length > 0);
      }
      else
      {
         Log().RecordError("Error shutting down connection to server", WSAGetLastError(), EventTypeError);
      }

      closesocket(connection);  //Fails HERE
      int wsa_err = WSAGetLastError();
      if(wsa_err)
          Log().RecordError("closesocket() error", wsa_err, EventTypeError);
   }

   if (winsockInitialized)
   {
      WSACleanup();
   }
}

有人知道为什么会发生这种事吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-18 18:22:46

您没有检查closesocket()的返回代码,这意味着WSAGetLastError()可能与closesocket操作相关,也可能与之无关。

票数 2
EN

Stack Overflow用户

发布于 2009-05-18 18:24:00

我不是Windows套接字专家,但我还是会尝试一下。您确定WSAGetLastError()返回的代码涉及对closesocket()的调用吗?

引用msdn

...这是必要的,因为如果成功,某些函数可能会将最后一个扩展错误代码重置为0。

我假设您之前可能有一个与套接字相关的调用失败(?)。Msdn告诉我们,在每次与套接字相关的调用之后,必须通过使用0调用WSASetLastError()来防止出现这种情况。

若要专门重置扩展错误代码,请使用将iError参数设置为零的WSASetLastError函数调用。

票数 0
EN

Stack Overflow用户

发布于 2009-05-24 09:12:43

错误状态几乎肯定是前一个操作遗留下来的。Winsock函数在成功时通常不会清除错误状态。

检查closesocket()返回的代码。如果这不表示错误,那么WSAGetLastError()的值就没有意义了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/879033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档