CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  网络编程

winsock(udp)收到大量数据之后

楼主doudoushen()2004-05-01 23:26:24 在 VB / 网络编程 提问

我那个程序winsock(udp)收到大量数据之后   机器越来越慢     最后程序就死了  
  我估计是收到数据后处理不能跟上发过来数据的速度     导致udp的缓存爆掉        
  大家帮我想想办法  
  1   比如及时清空缓存    
  2   故意丢掉点数据包(因为可能许多数据包内的数据是一样的)       谢谢 问题点数:20、回复次数:16Top

1 楼qyii(劳心劳力)回复于 2004-05-02 00:54:54 得分 0

这,不会的吧?  
   
  控件一定没问题!  
  问题   可能   出在你的程序~你是不是用for...next(循环)传送数据??是的话,一定会慢了~  
  虽然我耍winsock控件还是刚入门的水平~只觉得,winsock控件的数据不是用for...next(循环)来发的.  
   
  引用:"数据,笨不是这样发D..."呵呵!Top

2 楼doudoushen()回复于 2004-05-02 11:58:51 得分 0

我的环境是这样的     有16台机器(不是电脑)一台服务器一台客户机     每台机器10ms发一个数据给服务器       服务器进行处理然后写数据库     并把处理完的数据发给客户机     现在程序开一会就死了!!!!  
  各位大哥帮忙啊Top

3 楼doudoushen()回复于 2004-05-02 12:42:46 得分 0

怎么没人啊Top

4 楼doudoushen()回复于 2004-05-02 15:03:39 得分 0

救命啊  
  Top

5 楼fishmans(金脚指)回复于 2004-05-02 18:59:59 得分 0

服务端定时发送事务处理完成标志,客户   端收到后再发比较好。Top

6 楼qyii(劳心劳力)回复于 2004-05-08 17:45:48 得分 0

10ms   可能太忙了吧?   服务器不是收到马上录入,而是收到一定情度再录入可能会好些!  
   
   
  //以下的发言作保留  
   
  按你现在的情况,16台机,10ms发送一次!一直这样发下去,没有空闲过!没办法,做啥都没用!只能说这种设计在这种应用不能通过!  
   
  更改一下,只要有空闲,使用队列,或许可能可以解决!Top

7 楼doudoushen()回复于 2004-06-08 08:51:45 得分 0

TO   qyii(没读过大学)   怎么使用队列,队列我只在读书的时候看见过   但实践中重没碰到过  
  Top

8 楼goodname008(卢培培,充电中......)回复于 2004-06-08 09:39:35 得分 20

最好不要用WinSock控件,直接用API就行了:Windows   socket   functions。  
  查查MSDN,再稍微了解一下原理,你的程序只把数据发到操作系统内核缓冲区,实际传输时是协议帮你传的。  
  简单列几个函数:  
  WSAStartup  
  socket  
  bind  
  recv  
  send  
  listen  
  CloseSocket  
  WSACleanup  
   
  具体用法可以再查MSDN。Top

9 楼nik_Amis(...)回复于 2004-06-08 09:57:36 得分 0

upTop

10 楼doudoushen()回复于 2004-06-25 08:54:34 得分 0

能否给个简单的用API写winsock的例子     是直接在窗体写还是在(类)模块???     谢谢Top

11 楼doudoushen()回复于 2004-06-25 17:10:26 得分 0

顶Top

12 楼zhixin1007(陌生人)回复于 2004-06-27 18:22:49 得分 0

跪求WINSOCK的API用法用例,我已经找了他两年了...MSDN查过,大概是我不会用,始终没有完美的接决方案.Top

13 楼nnhy(大石头http://www.nnhy.org QQ群10193406)回复于 2004-07-19 23:38:24 得分 0

接受数据后,送给数组,然后用定时来处理Top

14 楼boyzhang(张郎)(爱你爱到Windows没BUG的那天)回复于 2004-07-19 23:46:24 得分 0

GZTop

15 楼goodname008(卢培培,充电中......)回复于 2004-07-20 12:39:11 得分 0

//   这是我5月份时用C写的一个小程序,翻译成VB的源代码肯定不是问题。  
   
   
  /********************************************************************/  
  /*   字节流发送器 作者:   卢培培 (2004.5) */  
  /* */  
  /*   功能:   向指定的计算机发送字节流 */  
  /* */  
  /*   用法: */  
  /* Send   <IP:port>   <bytes   stream> */  
  /*     <bytes   stream> */  
  /*     _computername             Local   computer   name */  
  /*     _mac                               Local   network   adapter   MAC   address */  
  /* */  
  /*   例子: */  
  /* Send   127.0.0.1:1510   hello,   world. */  
  /* Send   127.0.0.1:1510   MAC:   _mac   ComputerName:   _computername */  
  /********************************************************************/  
   
  //   包含头文件  
  #include   "stdafx.h"  
   
  //   定义发送字节流的缓冲区大小  
  #define   BUFSIZE   1024  
   
  //   函数声明  
  bool   GetMacAddress(char   *);  
   
  //   主程序入口函数  
  int   main(int   argc,   char*   argv[])  
  {  
  //   初始化帮助信息  
  char   help[BUFSIZE];  
  strcpy(help,   "Send   bytes   stream   to   a   specific   computer,   written   by   LPP.   (2004.5)\n");  
  strcat(help,   "usage:\n         ");  
  strcat(help,   argv[0]);  
  strcat(help,   "   <IP:port>   <bytes   stream>\n\n");  
  strcat(help,   "             <bytes   stream>\n");  
  strcat(help,   "             _computername                 Local   computer   name\n");  
  strcat(help,   "             _mac                                   Local   network   adapter   MAC   address\n\n");  
  strcat(help,   "example:\n         ");  
  strcat(help,   argv[0]);  
  strcat(help,   "   127.0.0.1:1510   hello,   world.\n         ");  
  strcat(help,   argv[0]);  
  strcat(help,   "   127.0.0.1:1510   MAC:   _mac   ComputerName:   _computername\n");  
   
   
  //   检查参数个数是否符合要求,   不得少于2个参数  
  if   (argc   <   3)  
  {  
  cout<<help<<endl;  
  return   1;  
  }  
   
  //   检查第1个参数是否符合要求,   正确格式为:   IP地址:端口号,   例:192.168.0.1:1015  
  if   (strstr(argv[1],   ":")   -   argv[1]   <=   0)  
  {  
  cout<<help<<endl;  
  return   1;  
  }  
   
  //   从第1个参数中提取IP地址和端口号  
  char   remoteIP[16];  
  int   remotePort;  
  memset(remoteIP,   0,   16);  
  memcpy(remoteIP,   argv[1],   strstr(argv[1],   ":")   -   argv[1]);  
  argv[1]   =   argv[1]   +   (strstr(argv[1],   ":")   -   argv[1])   +   1;  
  remotePort   =   atoi(argv[1]);  
  if   (inet_addr(remoteIP)   ==   -1)  
  {  
  cout<<"非法的IP地址."<<endl;  
  return   1;  
  }  
  if   (htons(remotePort)   ==   0)  
  {  
  cout<<"非法的端口号."<<endl;  
  return   1;  
  }  
   
  //   获得要发送的内容  
  char   *Message   =   (char   *)malloc(BUFSIZE);  
  memset(Message,   0,   BUFSIZE);  
  for   (int   i   =   2;   i   <   argc;   i++)  
  {  
  strcat(Message,   argv[i]);  
  if   (i   !=   argc   -   1)  
  strcat(Message,   "   ");  
  }  
   
  //   处理自定义环境变量:   _computername   为计算机名,   _mac   为本机网络适配器MAC地址  
  char   *lwrMessage   =   strlwr(strdup(Message));  
  char   *bakMessage   =   strdup(Message);  
  int   pos   =   strstr(lwrMessage,   "_computername")   -   lwrMessage;  
  if   (pos   >=   0) //   _computername  
  {  
  memset(Message,   0,   BUFSIZE);  
  char   *ComputerName   =   (char   *)malloc(MAX_COMPUTERNAME_LENGTH   +   1);  
  memset(ComputerName,   0,   MAX_COMPUTERNAME_LENGTH   +   1);  
  DWORD   len_ComputerName   =   MAX_COMPUTERNAME_LENGTH;  
  GetComputerName(ComputerName,   &len_ComputerName);  
  memcpy(Message,   bakMessage,   pos);  
  strcat(Message,   ComputerName);  
  strcat(Message,   bakMessage   +   pos   +   strlen("_computername"));  
  }  
  lwrMessage   =   strlwr(strdup(Message));  
  bakMessage   =   strdup(Message);  
  pos   =   strstr(strlwr(lwrMessage),   "_mac")   -   lwrMessage;  
  if   (pos   >=   0) //   _mac  
  {  
  memset(Message,   0,   BUFSIZE);  
  char   macAddress[18];  
  if   (!GetMacAddress(macAddress))  
  {  
  cout<<"无法获得网络适配器MAC地址."<<endl;  
  return   1;  
  }  
  memcpy(Message,   bakMessage,   pos);  
  strcat(Message,   macAddress);  
  strcat(Message,   bakMessage   +   pos   +   strlen("_mac"));  
  }  
  if   (strlen(Message)   >=   BUFSIZE)  
  {  
  cout<<"发送的字节流长度不能超过1024."<<endl;  
  return   1;  
  }  
   
  //   绑定socket库  
  WSADATA   wsaData;  
  if   (WSAStartup(MAKEWORD(2,   2),   &wsaData))  
  {  
  cout<<"绑定socket库失败."<<endl;  
  return   1;  
  }  
   
  //   采用流方式初始化socket  
  SOCKET   sock   =   socket(PF_INET,   SOCK_STREAM,   getprotobyname("tcp")->p_proto);  
  if   (sock   ==   INVALID_SOCKET)  
  {  
  cout<<"初始化socket失败."<<endl;  
  return   1;  
  }  
   
  cout<<"服务端:   "<<remoteIP<<"     端口:   "<<remotePort<<"\n"<<endl;  
   
  //   连接服务端  
  sockaddr_in   remoteAddress;  
  remoteAddress.sin_family   =   AF_INET;  
  remoteAddress.sin_addr.S_un.S_addr   =   inet_addr(remoteIP);  
  remoteAddress.sin_port   =   htons(remotePort);  
  memset(remoteAddress.sin_zero,   0,   8);  
  if   (connect(sock,   (sockaddr   *)&remoteAddress,   sizeof(remoteAddress)))  
  {  
  cout<<"连接服务端失败."<<endl;  
  return   1;  
  }  
   
  //   向服务端发送数据  
  if   (send(sock,   Message,   strlen(Message),   0)   ==   SOCKET_ERROR)  
  {  
  cout<<"发送数据失败."<<endl;  
  return   1;  
  }  
   
  cout<<"发送成功."<<endl;  
   
  //   释放资源  
  closesocket(sock);  
  WSACleanup();  
   
  return   0;  
  }  
   
  /********************************************************************/  
  /*   获得本机网络适配器MAC地址,   返回的MAC地址格式为   01:23:45:67:89:AB   */  
  /* */  
  /*   参数: */  
  /* macAddress   不少于18个字节的缓冲区,   用于保存MAC地址 */  
  /* */  
  /*   返回值: true   成功,   false   失败 */  
  /********************************************************************/  
  bool   GetMacAddress(char   *macAddress)  
  {  
  //   定义Adapter结构  
  typedef   struct  
  {  
  ADAPTER_STATUS   adapter;  
  NAME_BUFFER   NameBuffer[30];  
  }   Adapter;  
   
  //   初始网络控制块NCB  
  _NCB   ncb;  
  memset(&ncb,   0,   sizeof(ncb));  
   
  //   如果存在多块网卡需要用下面的代码在主程序中枚举所有网络适配器,   结果保存在AdapterList中  
  /*  
  LANA_ENUM   AdapterList;  
  memset(&ncb,   0,   sizeof(ncb));  
  ncb.ncb_command   =   NCBENUM;  
  ncb.ncb_buffer   =   (UCHAR   *)&AdapterList;  
  ncb.ncb_length   =   sizeof(AdapterList);  
  Netbios(&ncb);  
  if   (ncb.ncb_retcode)   return   false;  
  */  
   
  //   复位网络适配器  
  ncb.ncb_command   =   NCBRESET;  
  ncb.ncb_lana_num   =   0; //   如果存在多块网卡则使用AdapterList.lana[i],   0为第一块  
  Netbios(&ncb);  
  if   (ncb.ncb_retcode)   return   false;  
   
  //   获得网络适配器状态  
  Adapter   adapter;  
  memset(&adapter,   0,   sizeof(Adapter));  
  ncb.ncb_command   =   NCBASTAT;  
  ncb.ncb_lana_num   =   0; //   如果存在多块网卡则使用AdapterList.lana[i],   0为第一块  
  ncb.ncb_buffer   =   (UCHAR   *)&adapter;  
  ncb.ncb_length   =   sizeof(Adapter);  
  strcpy((char   *)ncb.ncb_callname,   "*");  
  Netbios(&ncb);  
  if   (ncb.ncb_retcode)   return   false;  
   
  //   将网络适配器MAC地址格式化为   01:23:45:67:89:AB  
  sprintf(macAddress,   "%02X:%02X:%02X:%02X:%02X:%02X",    
  (int)adapter.adapter.adapter_address[0],  
  (int)adapter.adapter.adapter_address[1],  
  (int)adapter.adapter.adapter_address[2],  
  (int)adapter.adapter.adapter_address[3],  
  (int)adapter.adapter.adapter_address[4],  
  (int)adapter.adapter.adapter_address[5]);  
  return   true;  
  }Top

16 楼subzero(赘姆烂壳)回复于 2004-07-20 18:39:31 得分 0

说来听听,什么样的应用需要这么高的实时数据传输  
  Top

相关问题

  • VB 中的winsock控件用udp协议有crc校验,会把收到的错误数据丢弃吗?
  • winsock控件用udp协议有crc校验,会把收到的错误数据丢弃吗?
  • winsock控件用udp协议有crc校验,会把收到的错误数据丢弃吗?
  • 用UDP传输怎么会只收到了一次数据?
  • UDP怎么知道何时收到数据?
  • Delphi里UDP控件如何接收到c#中UDPclient发送的数据
  • 使用数据报Socket(UDP),如何在收到数据包时得到发送方的IP地址。
  • 请问怎样用winsock实现拦截udp数据包
  • 为什么winsock控件没有接收到数据?(在线等待)
  • 我用UDP作视频转发接收方收到数据但不能显示,请各位指教。

关键词

  • 数据
  • winsock
  • mac
  • 控件
  • 函数
  • 服务器
  • msdn
  • computer
  • computername
  • strcat

得分解答快速导航

  • 帖主:doudoushen
  • goodname008

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo