诡谲的连接(客户端和服务端已经连将了,accept却没有调用)
诡异的连接(客户端和服务端已经连将了,accept却没有调用)
用工具看了,确实 客户端和服务端已经连接
但是服务端的 acccept这一句代码,却是无法执行(所谓无法执行就是,我设置了断点,却没有运行到这里,我怀疑,是否消息注册错了)
有人质疑, 为什么说 客户端和服务端连接了呢?
我会在2楼提供我的客户端代码,大家看到就明白了
服务端代码,注意看 窗口处理函数代码
------解决方案--------------------
用工具看了,确实 客户端和服务端已经连接
但是服务端的 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); }
------解决方案--------------------