VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1740|回复: 5

[交流] TCP监听时间长了 本地断网 ....

[复制链接]
06_avatar_middle
online_vip 发表于 2016-6-15 16:59:03 | 显示全部楼层 |阅读模式
3驿站币
本帖最后由 衍晨 于 2016-6-15 17:00 编辑

我写了个程序

里面监听了个端口


  1. DWORD WINAPI ListenThreadFunc(LPVOID pParam)
  2. {
  3.         CClient_Socket *Client_Socket =(CClient_Socket*)pParam;;

  4.         CConsole_Work *Console_Work = Client_Socket->Console_Work;

  5.         CConsole_ClientDlg *Console_ClientDlg = Console_Work->Console_ClientDlg;

  6.         SOCKET ListenSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
  7.         if (ListenSock == INVALID_SOCKET ) {
  8.                 AfxMessageBox(_T("新建Socket失败!"));
  9.                 return FALSE;
  10.         }

  11.         int iPort = 5568;

  12.         sockaddr_in service;
  13.         service.sin_family = AF_INET;
  14.         service.sin_addr.s_addr = INADDR_ANY;
  15.         service.sin_port = htons(iPort);

  16.         if ( bind(ListenSock, (sockaddr*)&service, sizeof(sockaddr_in)) == SOCKET_ERROR ) {
  17.                 AfxMessageBox(_T("绑定端口失败!"));

  18.                 return 0;
  19.         }
  20.         if( listen(ListenSock, 5) == SOCKET_ERROR ) {
  21.                 AfxMessageBox(_T("监听失败!"));
  22.                 return 0;
  23.         }
  24.         while (1)
  25.         {
  26.                 if ( Client_Socket->SOCKET_Select(ListenSock, 100, TRUE) )
  27.                 {
  28.                         sockaddr_in clientAddr;
  29.                         int iLen = sizeof(sockaddr_in);
  30.                         SOCKET accSock = accept(ListenSock, (struct sockaddr *)&clientAddr , &iLen);
  31.                         if (accSock == INVALID_SOCKET) continue;

  32.                         int ID =NULL;

  33.                         recv(accSock,(char*)&ID,sizeof(int),0);
  34.                     
  35.                         ................

  36.                 }
  37.                 Sleep(500);
  38.         }
  39.         return 0;
  40. }
复制代码


  1. BOOL CClient_Socket::SOCKET_Select(SOCKET hSocket,int nTimeOut, BOOL bRead)
  2. {
  3.         fd_set fdset;     //fd_set为管理多个套接字的结构体
  4.         timeval tv;   //超时时间结构体
  5.         FD_ZERO(&fdset);//将集合初始化为空集合
  6.         FD_SET(hSocket, &fdset);//将套接字hSocket加入集合fdset
  7.         nTimeOut = nTimeOut > 1000 ? 1000 : nTimeOut;
  8.         tv.tv_sec  = 0;//超时时间---秒
  9.         tv.tv_usec = nTimeOut;//超时时间---毫秒

  10.         int iRet = 0;
  11.         if ( bRead ) {
  12.                 iRet = select(0, &fdset, NULL , NULL, &tv);//查看服务器套接字集合是否有可读
  13.         }else{
  14.                 iRet = select(0, NULL , &fdset, NULL, &tv);//查看服务器套接字集合是否有可写
  15.         }

  16.         if(iRet <= 0) {
  17.                 return FALSE;
  18.         } else if (FD_ISSET(hSocket, &fdset)){   //查看套接字 hSocket是否在集合fdset中
  19.                 return TRUE;
  20.         }
  21.         return FALSE;
  22. }
复制代码

部分是抄袭SYC老大的代码TCP监听时间长了 本地断网 ....

还有一个就是连接服务器




  1. DWORD WINAPI Comm_Service(LPVOID lpParamer)
  2. {
  3.         CConsole_Socket *Console_Socket = (CConsole_Socket*)lpParamer;

  4.         CConsole_ClientDlg *Console_ClientDlg = Console_Socket->Console_ClientDlg;

  5.         HANDLE hHeartBeat,hServiceTips;

  6.         while (1)
  7.         {

  8.                 Console_Socket->sock_service=socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); //创建套接字

  9.                 if (INVALID_SOCKET==Console_Socket->sock_service)
  10.                 {
  11.                         Console_ClientDlg->SetDlgItemText(IDC_CONSOLE_STATUS,"创建套接字失败!");

  12.                         Sleep(3000);

  13.                         continue;
  14.                 }

  15.                 sockaddr_in server;

  16.                 server.sin_family = AF_INET;

  17.                 server.sin_port = htons(Console_ClientDlg->m_Console_port);//结构,端口号

  18.                 CString ipstr;

  19.                 BYTE IP0,IP1,IP2,IP3;

  20.                 Console_ClientDlg->m_Console_address.GetAddress(IP0,IP1,IP2,IP3);

  21.                 ipstr.Format("%d.%d.%d.%d",IP0,IP1,IP2,IP3);

  22.                 server.sin_addr.s_addr = inet_addr(ipstr);

  23.                 if (connect(Console_Socket->sock_service, (struct sockaddr *)&server, sizeof(struct sockaddr)) == SOCKET_ERROR )
  24.                 {               
  25.                         Console_ClientDlg->SetDlgItemText(IDC_CONSOLE_STATUS,"连接失败,请重试!");
  26.                 }else
  27.                 {
  28.                         Console_ClientDlg->SetDlgItemText(IDC_CONSOLE_STATUS,"已连接到服务端!");

  29.                         hHeartBeat =::CreateThread(NULL,NULL,Console_HeartBeat,Console_Socket,NULL,NULL);

  30.                         hServiceTips =::CreateThread(NULL,NULL,Console_Service,Console_Socket,NULL,NULL);

  31.                         WaitForSingleObject(hHeartBeat,INFINITE);

  32.                         Console_ClientDlg->SetDlgItemText(IDC_CONSOLE_STATUS,"服务端断开!");

  33.                 }

  34.                 Sleep(2000);
  35.         }
  36.         return 0;
  37. }
复制代码


写的可能是有问题了, 就是几小时本地断网一次,,需要关闭这个程序才能上网,,,这什么鬼 是不是我哪里错啦??





上一篇:大一的C作业帮忙看看谢了
下一篇:在下有个疑问.
06_avatar_middle
ico_lz  楼主| 发表于 2016-6-15 20:43:39 | 显示全部楼层
@Syc 老大 知道啥回事吗???
51_avatar_middle
online_admins 发表于 2016-6-16 09:22:25 | 显示全部楼层
衍晨 发表于 2016-6-15 20:43
@Syc 老大 知道啥回事吗???

暂时看这些代码没看出什么问题,要是整个系统的网络被阻断的话是不是数据量过大,循环中不停的收发导致网络阻塞,也只是猜测,具体也得调试调试或者输出Log的方式来看看了
06_avatar_middle
ico_lz  楼主| 发表于 2016-6-16 12:10:45 | 显示全部楼层
本帖最后由 衍晨 于 2016-6-16 12:19 编辑
Syc 发表于 2016-6-16 09:22
暂时看这些代码没看出什么问题,要是整个系统的网络被阻断的话是不是数据量过大,循环中不停的收发导致网 ...


怎么输出LOG啊??
注释了 DWORD WINAPI Comm_Service(LPVOID lpParamer) 连接服务器这线程好像没事了  服务器我没开,所以连接服务器后的代码里面没问题 是不是 Console_Socket->sock_service=socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); //创建套接字
这操作太多导致的,,,,需要close 我测试下
17_avatar_middle
online_supermod 发表于 2016-6-17 11:59:03 | 显示全部楼层
衍晨 发表于 2016-6-16 12:10
怎么输出LOG啊??
注释了 DWORD WINAPI Comm_Service(LPVOID lpParamer) 连接服务器这线程好像没事 ...

Console_Socket->sock_service=socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);

这里放在WHILE会大量占用系统资源,放WHILE上面就行了,只初始化一次,不用了一定要调closesocket
06_avatar_middle
ico_lz  楼主| 发表于 2016-6-17 21:19:57 | 显示全部楼层
本帖最后由 衍晨 于 2016-6-17 21:23 编辑
Koma 发表于 2016-6-17 11:59
Console_Socket->sock_service=socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);

这里放在WHILE会大量占 ...


又见家驹版主哈

我测试看看去  谢谢
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-7-24 00:50

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表