| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1385 人关注过本帖
标题:[求助斑竹]一个API的问题.....在VC++中可行.
只看楼主 加入收藏
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
 问题点数:0 回复次数:18 
[求助斑竹]一个API的问题.....在VC++中可行.

在看这个只前 请你先帮我把它翻译成VB能用的代码

都是调用同样的函数 在VB中调用就显示错误
变量未定义 可能是缺少点什么 会API的进来帮忙啊.....


  Winsock用WINDOWS API实现:
  
  (1)服务器端有两个线程:
  主线程 — 你需要编写以下函数来实现
  
  #define NETWORK_EVENT USER_MESSAGE+100 file://定义网络事件
  sockaddr_in clientaddr; file://暂时存放客户端IP地址
  
  file://自己定义消息映射函数,将上面定义的网络事件映射到处理函数
  file://OnNetEvent为网络事件处理函数,它在下面定义
  ON_MESSAGE(NETWORK_EVENT, OnNetEvent);
  
  在你对话框中的初始化函数中调用下面的初始化网络的子函数
  BOOL InitNetwork() file://初始化网络
  {
  file://初始化TCP协议
  BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
  if(ret != 0)
  {
  MessageBox("初始化套接字失败!");
  return FALSE;
  }
  
  file://创建服务器端套接字
  SOCKET serverSocket
  = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if(serverSocket == INVALID_SOCKET)
  {
  MessageBox("创建套接字失败!");
  closesocket(m_Socket);
  WSACleanup();
  return FALSE;
  }
  
  file://绑定到本地一个端口上
  sockaddr_in localaddr;
  localaddr.sin_family = AF_INET;
  localaddr.sin_port = htons(1688);
  localaddr.sin_addr.s_addr = 0;
  if(bind(serverSocket ,(const struct sockaddr*)&localaddr,
  sizeof(sockaddr)) == SOCKET_ERROR)
  {
  MessageBox("绑定地址失败!");
  closesocket(m_Socket);
  WSACleanup();
  return FALSE;
  }
  
  file://注册网络异步事件,m_hWnd为应用程序的主对话框或主窗口的句柄
  WSAAsyncSelect(serverSocket, m_hWnd, NETWORK_EVENT,
  FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);
  
  listen(serverSocket, 5); file://设置侦听模式
  
  return TRUE;
  }

  file://定义网络事件的响应函数
  void OnNetEvent(WPARAM wParam, LPARAM lParam)
  {
  file://调用API函数,得到网络事件类型
  int iEvent = WSAGETSELECTEVENT(lParam);
  
  file://得到发出此事件的客户端套接字
  SOCKET pSock = (SOCKET)wParam;


switch(iEvent)
  {
  case FD_ACCEPT: file://客户端连接请求
  {
  OnAccept();
  
  break;
  }
  case FD_CLOSE: file://客户端断开事件:
  {
  OnClose(pSock);
  break;
  }
  case FD_READ: file://网络数据包到达事件
  {
  OnReceive(pSock);
  break;
  }
  case FD_WRITE: file://发送网络数据事件
  {
  OnSend(pSock);
  break;
  }
  default: break;
  }
  }
  
  void OnAccept(SOCET pSock) file://响应客户端连接请求函数
  {
  int len = sizeof(sockaddr);
  
  file://调用API函数,接受连接,并返回一个新套接字
  file://还可以获得客户端的IP地址
  SOCKET clientSocket = accept(serverSocket,
  (struct sockaddr*)&clientaddr, &len);
  
  file://为新的socket注册异步事件,注意没有Accept事件
  if(WSAAsyncSelect(clientSocket ,m_hWnd, IP_EVENT,
  FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
  {
  MessageBox("注册异步事件失败!");
  return;
    }
  
  file://自编函数,将此客户端的相关信息保存下来:套接字、
  // IP地址、登陆时间
  saveClientSocket(clientSocket,clientAddr,currentTimer);
  }
  
  void OnClose(SOCET pSock)
  {
  file://自编函数,结束与相应的客户端的通信,释放相应资源并做相应处理
  endClientSocket(pSock);
  }
  
  void OnSend(SOCET pSock)
  {
  file://自编函数,在给客户端发数据时做一些预处理
  handleOnSend(pSock);
  }
  
  void OnReceive(SOCET pSock)
  {
  recv(...); file://调用API函数,读出网络缓冲区中的数据包
  
  file://自编函数,将此数据包和发出此数据的客户端
  file://clientSocket封装成一条网络消息
  buildNetMsg(...);
  
  file://自编函数,将此网络消息放入一个消息队列中,由工作线程去处理
  saveNetMsg(...);
  SetEvent(...); file://用事件对象触发工作线程


 }
  
  客户端登陆后,随即把自己的计算机名发给服务器,服务器接到后,把它保存下来。这样服务器就可以显示所有在线客户端的信息了,包括:客户端计算机名、IP地址、登陆时间等。
  
  注意: 客户端没有OnAccept()函数,但有OnConnect()函数。
  
  工作线程 —
  在你的应用程序初始化时,创建并启动一个工作线程
  
  AfxBeginThread(WorkThread,this,THREAD_PRIORITY_NORMAL);
  file://this可能为应用程序的主对话框或主窗口的句柄
  
  UINT WorkThread(LPVOID pParam)
  {
  while(1)
  {
  file://等待多重事件到来
  int ret = WaitForMultipleObject(...);
  
  switch(ret)
  {
  case OBJECT_0:
  {
  if(bNewNetMsg) file://查看网络消息队列是否有新的网络消息
  {
  readNetMsg(...); file://如有新的网络消息,则读出
  handleNetMsg(...); file://处理此网络消息
  }
  break;
  }
  case OBJECT_0 + 1:
  {
  file://做退出处理
  break;
  }
  default: break;
  }
  
  return 0;
  }
  
  客户端为单线程,登陆服务器时,用connect()函数给服务器发连接请求;
  客户端没有OnAccept()函数,但有OnConnect()函数。
  在OnConnect()函数里做发连接请求时的预处理;
  在OnReceive()函数里响应并处理网络数据;
  在OnClose()函数里响应服务器的关闭事件;
  在OnSend()函数里做发数据时的预处理;


[此贴子已经被作者于2006-9-12 11:49:01编辑过]

搜索更多相关主题的帖子: API 斑竹 
2006-09-10 14:50
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
求助,,,

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-09-11 11:15
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

请帮忙  ..版主  求救  SOS


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-09-12 10:09
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
或者 WSAASYNSELECT怎么用 OnNetEvent是自定义函数 怎么和Wparam有关联.如果在VB中它是一个自定义 那也许是

function OnNetEvent (byval wparam as wparam ,byval lparam as lparam ) as long

end function
这样定义的吧 可是WPARAM这个东西在VB中没有解释啊...
如果是

function OnNetEvent(byval wparam as string ,byval lparam as string) as long

end function

这样定义的话可以过去的...
但是用到子程序的语句后如何对Wpara赋上值呢?


综合上文可以看出,OnNetEvent子程序其中有一个switch(iEvent)语句...它是多条件语句...
而用FUNCTION后面括号里的肯定是赋值.....



怎么办啊 让我干着急...

[此贴子已经被作者于2006-9-12 10:52:29编辑过]


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-09-12 10:49
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
不是偶不在网上搜答案  确实已经在网上搜了两天了  什么事情都没做啊.....

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-09-12 11:37
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
SWITCH 对应VB中的select吧....
dim inetbb$
function sockbufer (byval smont as string)
select case inetbb
case on_accept
.............
case on_read
............
case else
...........
end select
end function


这样的算一个多余的子程序吗???见过这样的程序吗???那个smont是做什么用的 呵呵

我这是照VC++翻译的...


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-09-12 11:54
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
在VC++里有了一个答案 可是不够详细
对与我这样的小菜鸟来说 那些东西真的很难

这个是帖子连接 帮忙看看

[URL=http://www.bc-cn.net/bbs/dispbbs.asp?boardID=55&ID=89569&page=1]http://www.bc-cn.net/bbs/dispbbs.asp?boardID=55&ID=89569&page=1[/URL]


有知道的请不要吝啬你的想法和埋汰你的智慧.

即使不会也要发言啊,比如 你比我还菜

呵呵 在一个论坛总是要交流的吧 别都在论坛上干窝着 看了不回不会也不问,会的带着鄙视的望着楼猪....

是 偶是菜


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-09-12 13:10
yyy505
Rank: 1
等 级:新手上路
威 望:1
帖 子:49
专家分:0
注 册:2006-9-7
收藏
得分:0 
顶一下,偶也很菜!

2006-09-12 14:45
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

不知道为什么,VB论坛在线的人很多,说话的很少..

而且对于那些简单的问题 一大队的人马浩浩荡荡的踏着滚滚浓烟飞驰而去...

而这样的稍微有点难回答的问题 或者回答字数比较多的问题

很多人都懒的回答...

一点经验都不讲...

哎 门可罗雀啊..

顺便给大家弄一个VB学习的网站

[URL=http://www.0240.cn/html/computer/vb/list_183_5.html]http://www.0240.cn/html/computer/vb/list_183_5.html[/URL]

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-09-12 16:18
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
再顶一下 谁能给个解释啊...

yesshow 那为斑竹不是知道API和VC++很多吗 进来看到的时候请帮忙回答一下...




[URL=http://www.bc-cn.net/bbs/dispbbs.asp?boardID=55&ID=89569&page=1]http://www.bc-cn.net/bbs/dispbbs.asp?boardID=55&ID=89569&page=1[/URL]

去那里看看 希望你能把那个VC++翻译成VB

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-09-12 16:59
快速回复:[求助斑竹]一个API的问题.....在VC++中可行.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017593 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved