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

解决方案 »

  1.   


    为什么说 我看到了客户端和服务端连接呢?看while循环后有一句printf函数如果连接成功,则打印成功,否则打印失败!!1
    我开启了客户端,当时服务端的accept没有被调用,是怎么回事啊?更是收不到任何数据呢?
    不要说用getlasterror,根本进不了 case WM_SOKCET:
    {

    if(HIWORD(lp))
    {
    closesocket(s);
    return -1;
    无法进入啊客户端代码
    //////////////////////////////////////////////////////////
    // TCPClient.cpp文件
    #include "common/InitSock.h"
    #include <stdio.h>
    CInitSock initSock; // 初始化Winsock库int main()
    {
    // 创建套节字
    SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(s == INVALID_SOCKET)
    {
    printf(" Failed socket() \n");
    return 0;
    }

    // 也可以在这里调用bind函数绑定一个本地地址
    // 否则系统将会自动安排

    // 填写远程地址信息
    sockaddr_in servAddr; 
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(9585);
    // 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址
    // 如果你的计算机没有联网,直接使用127.0.0.1即可
    servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    while(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
    {
    Sleep(500);
    printf(" Failed connect() \n");
    continue;

    } printf(" Success connect() \n"); char buf[100];
    memset(buf,0,100); strcpy(buf,"hello");
    for(int i=0; i<10;i++) {
    send(s,buf,100,0);
    Sleep(200);
    }
    ZeroMemory(buf,sizeof(buf));
    recv(s,buf,sizeof(buf),0); printf("收到的数据为%s\n",buf);

    // 关闭套节字
    ::closesocket(s);
    return 0;
    }
      

  2.   

    没进Accept,已经连接?我个人认为这是矛盾的吧
      

  3.   

    WSAAsyncSelect(g_listenSock,hwnd,WM_SOKCET,FD_CONNECT|FD_READ);
    FD_ACCEPT ?
      

  4.   

    是否连接上和是否被accept本身就两种概念,至少windows是这样的