我在http://www.vckbase.com/code/findcode.asp上下载那个SOCKET API通讯程序源代码 详细信息 < WinSock >  本代码包括客户端与服务器端,可以相互发送消息。[代码性质] VC完整应用程序代码
[代码作者] dzct
[文件大小] 44K 
[更新日期] 2003-2-10 19:10:00 
[下载次数] 2994 
看了代码之后,有所收益,但也有一些地方不明白:
1. iErrorCode=WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT);
         // 产生相应传递给窗口的消息为WM_SERVER_ACCEPT ,这是自定义消息    if (iErrorCode == SOCKET_ERROR) 
{
         list.InsertString(0,"WSAAsyncSelect设定失败!——用于连接请求的消息");
         return;
}
为什么要放在监听函数:
 if (listen(ServerSocket,1) == SOCKET_ERROR) //开始监听客户连接请求
{
list.InsertString(0,"服务器监听失败!");
        return;
}
之前,这样的话,那个WSAAsyncSelect还有什么作用,因为还没有客户请求事件发生呀?
2.在stdafx.h中建的结构Msg,其中的i起什么作用?
3.在stdafx.h中定义的#define WM_CLIENT_ACCEPT WM_USER+101
#define WM_CLIENT_READCLOSE WM_USER+102
为什么非要是101,102不可?

解决方案 »

  1.   

    WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT);
    这个函数主要是将SOCKET和一个处理网络事件的函数关联在一起。
      

  2.   

    哦,忘了告诉大家了,在那个网址上的搜索条件是:socket
      

  3.   

    也没有说非要101,102不可。可能习惯而已。
    #define wm_user 0x0400 表示应用中的用户自定义的消息,通常形式是wm_user+x,范围是0x0400到0x7fff.
      

  4.   

    #define WM_CLIENT_READCLOSE WM_USER+102
    为什么非要是101,102不可?WM_USER 是从WINDOWS 3.X中继承过来的,为了保持兼容,仍然保留着,因为windows消息越来越多,所以microsoft建议用户自定义消息至少要用WM_USER+100以上(有的说法是WM_USER+1000以上)现在在win32中,推荐使用WM_APP来定义用户的消息WM_APP是win32新增加的。#define WM_USER 0x400
    #define WM_APP 0x8000
      

  5.   

    推荐使用WM_APP来定义用户的消息,那么#define WM_CLIENT_READCLOSE WM_APP+X,这个X应该大于多少?
      

  6.   

    http://expert.csdn.net/Expert/topic/1905/1905156.xml?temp=.2795221请教疑问:
    现有一聊天程序,局域网内任何机器登录,就会在所有用户的在线列表里添加,请问他是怎么实现的?
    这个程序登录时没有提示要输入服务器IP,也不需要指定端口号,就直接登录到聊天界面了.看上去像是不需要服务器的.也没有数据库.
    方案1.遍历网段内所有IP的默认端口,获取已登录此聊天程序的用户列表,逐个发送消息,通知:我登录啦.然后打开自己的端口,把在线用户添加到自己的在线列表中.
    方案2.类似于net send * msg之类的原理,向网段内所有IP广播一条消息:我登录啦.如果收到回应,就确定在线.我对协议,网络没什么概念,我不知道我在说些什么.但我想了解这个程序工作的浅显的原理.登录过程序消息是怎么传递的,希望有高人指点一二.
    方案一,方案二估计都不是什么切实可地的方案.:)
    我知道他用winsock实现,用到udp协议.
    我在192.168.0.XXX网段测试的.
    再问:udp是不是只能在局域网内广播消息?我还测试过:第一个登录者退出后,第二个第三个还是可以继续正常的聊天通讯的.