打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
阻塞模式的accept线程退出

在退出时,主线程依次调用 shutdown 和 closesocket 良好的关闭 accept  对应的 socket,此时 accept 工作线程中 accept 函数会返回 INVALID_SOCKET。

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

SOCKET listen_socket;

bool Init(unsigned short listen_port)
{
 SOCKADDR_IN local;
 listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if (listen_socket == INVALID_SOCKET)
 {
  return false;
 }
 local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
 local.sin_family = AF_INET;
 local.sin_port = htons(listen_port);

 if (bind(listen_socket, (sockaddr *)&local, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
 {
  closesocket(listen_socket);
  listen_socket = INVALID_SOCKET;
  return false;
 }
 if (listen(listen_socket, 32) == SOCKET_ERROR)
 {
  closesocket(listen_socket);
  listen_socket = INVALID_SOCKET;
  return false;
 }
 return true;
}

DWORD WINAPI AcceptThreadProc(LPVOID param)
{
 while (!*(bool *)param)
 {
  sockaddr_in remote_addr;
  int addr_len = sizeof(sockaddr);
  printf("accept start\n");
  SOCKET sock = accept(listen_socket, (sockaddr *)&remote_addr, &addr_len);
  printf("socket = %d\n", sock);
 }
 return 0;
}

int main()
{
 WSADATA wsa_data;
 if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0)
 {
  return 0;
 }
 if (Init(9999))
 {
  bool stop = false;
  HANDLE accept_thread = CreateThread(0, 0, AcceptThreadProc, &stop, 0, 0);
  if (accept_thread != NULL)
  {
   system("pause"); 
  }
  stop = true;
  shutdown(listen_socket, SD_BOTH);
  closesocket(listen_socket);
  WaitForSingleObject(accept_thread, INFINITE);
  CloseHandle(accept_thread);
  accept_thread = NULL;
 }
 WSACleanup();
 return 0;
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
socket operation on non-socket 的原因
Windows下C语言的Socket编程例子(TCP和UDP)
C++ Socket编程步骤
[精通WindowsSocket网络开发
socket error 10053,10054究竟是怎么引起的
C语言、嵌入式应用:TCP通信实例分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服