诡谲的连接(客户端和服务端已经连将了,accept却没有调用)

诡异的连接(客户端和服务端已经连将了,accept却没有调用)

用工具看了,确实 客户端和服务端已经连接

但是服务端的 acccept这一句代码,却是无法执行(所谓无法执行就是,我设置了断点,却没有运行到这里,我怀疑,是否消息注册错了)


有人质疑, 为什么说 客户端和服务端连接了呢?

我会在2楼提供我的客户端代码,大家看到就明白了


服务端代码,注意看 窗口处理函数代码


C/C++ code



#include <STDIO.H>
#include <winsock2.h>
#include<windows.h>

#pragma comment(lib, "WS2_32")    // 链接到WS2_32.lib
#define WM_SOKCET (WM_USER+100)        //套接字消息

//加载环境
class CInitWinSock
{
public:
    CInitWinSock(BYTE minorVer = 2, BYTE majorVer = 2)
    {
        // 初始化WS2_32.dll
        WSADATA wsaData;
        WORD sockVersion = MAKEWORD(minorVer, majorVer);
        if(::WSAStartup(sockVersion, &wsaData) != 0)
        {
            exit(0);
        }
    }
    ~CInitWinSock()
    {
        ::WSACleanup();
    }
};


CInitWinSock g_initsock;            //全局对象
SOCKET g_listenSock;            //监听套接字



LRESULT WINAPI WinSunProc(HWND, UINT,WPARAM,LPARAM);


int main()
{
    
    
    WNDCLASS win;
    win.style=CS_HREDRAW | CS_VREDRAW ;//类型窗口的样式 风格 水平重画和垂直重画
    win.lpfnWndProc=WinSunProc;//窗口过程函数(回调函数)函数指针
    
    win.cbClsExtra=0;   // 一般为0   附加内存空间
    win.cbWndExtra=0;   // 一般为0   窗口附加内存
    win.hbrBackground=(HBRUSH)GetStockObject(0);//背景画刷句柄
    win.hCursor=LoadCursor(NULL,IDC_CROSS); //光标句柄
    win.hIcon=LoadIcon(NULL,IDI_ERROR); //窗口类的图标句柄
    win.hInstance= NULL;        //hInstance;            //包含窗口过程的实例句柄
    
    win.lpszClassName="11";//窗口类名
    win.lpszMenuName=NULL;
    /////////////////
    
    
    
    ////////////////////////////////////////////////////////////////////////////
    //定义窗口类
    RegisterClass(&win);//注册窗口类
    
    HWND hwnd;
    hwnd=CreateWindow("11","zhangyongfeng",WS_OVERLAPPEDWINDOW,
        100,100,600,400,NULL,NULL,NULL,NULL); //创建窗口
    
    
    //创建监听套接字
    
    
    USHORT nPort = 9585; // 此服务器监听的端口号
    
    // 创建监听套节字
    g_listenSock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(nPort);
    //    sin.sin_addr.S_un.S_addr = INADDR_ANY;
    sin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    // 绑定套节字到本地机器
    if(::bind(g_listenSock, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
        printf(" Failed bind() \n");
        return -1;
    }
    
    WSAAsyncSelect(g_listenSock,hwnd,WM_SOKCET,FD_CONNECT|FD_READ);
    // 进入监听模式
    ::listen(g_listenSock, 5);
    
//    UpdateWindow(hwnd);
//    ShowWindow(hwnd, SW_SHOW);
    
    MSG msg;
    
    while(GetMessage(&msg, hwnd, 0,0))
    {
        DispatchMessage(&msg);
        
    }
    return 0;
}






LRESULT WINAPI WinSunProc(HWND hwnd, UINT msg,WPARAM wp,LPARAM lp)
{

    SOCKET s=(SOCKET)wp;

    switch(msg)
    {
    case WM_SOKCET:    
        {    
        
        if(HIWORD(lp))
        {
            closesocket(s);
            return -1;
        }
        switch(LOWORD(lp))
        {
            
        case FD_ACCEPT:    //接受
            {
                SOCKET newSocket=accept(s,NULL,NULL);
                WSAAsyncSelect(newSocket,hwnd,WM_SOKCET,FD_READ|FD_WRITE|FD_CLOSE);
                break;
            }
            
        case FD_CLOSE:
            {
                closesocket(s);
                break;
            }
            
        case FD_READ:
            {
                char buf[200];
                ZeroMemory(buf,200);
                int nRet=recv(s,buf,sizeof(buf),0);
                printf("%s\n",buf);
                break;    
            }
        }            //end 内部switch
        } //end case
            
            
        case WM_QUIT:
            {
                
                PostQuitMessage(0);
                break;
            }
    }        //end switch
    return DefWindowProc(hwnd,msg,wp,lp);
    
}







------解决方案--------------------