回 帖 发 新 帖 刷新版面

主题:WINSOCKET 聊天程序

// Socket Client.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "windows.h"
#include "winsock2.h"
#include "ws2tcpip.h"
#include "Socket Client.h"
#pragma comment(lib,"Ws2_32.lib")
#pragma warning(disable:4312)
#pragma warning(disable:4267)
#pragma warning(disable:4244)

#define MAX_LOADSTRING 100
#define ID_RECVEDIT 1
#define ID_SENDEDIT 2
#define ID_SENDBTN  3
#define SERVER_PORT 4500
#define ADDR_MAX_LEN 16
#define WM_SOCKET (WM_USER+ 1)

//全局变量
HINSTANCE hInst;
WNDPROC   SendProc;
WNDPROC   RecvProc;
TCHAR     szTitle[MAX_LOADSTRING];
TCHAR     szWindowClass[MAX_LOADSTRING];
CHAR      szServerAddr[ADDR_MAX_LEN];

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    Dlg1Proc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    SendEditProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    RecvEditProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

     // TODO: 在此放置代码。
    MSG msg;
    HACCEL hAccelTable;

    // 初始化全局字符串
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_SOCKETCLIENT, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SOCKETCLIENT));

    // 主消息循环:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}
//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
//  注释:
//
//    仅当希望
//    此代码与添加到 Windows 95 中的“RegisterClassEx”
//    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
//    这样应用程序就可以获得关联的
//    “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SOCKETCLIENT));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_SOCKETCLIENT);
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

回复列表 (共13个回复)

11 楼

你调试了么?这跟协议没关系,你输入外网 ip,外网能正确 connect() 么?
你动态跟踪了么? 这种要都没调试,你指望谁帮你做? 判断 ip 是否处于活动,
可以发送 icmp packet。 不过如果对方把 icmp echo 给禁了,你一样得不到,
或者根据 connect() 返回判断。

12 楼

我没办法试。我的EXE文件在别人机器上打都打不开
只能在自己机器上玩,朋友说要把整个工程压缩成安装文件,我不会

13 楼


你还是先别弄这些,先学些基本常识,明白什么叫静态编译。了解些基本的
socket 编程原理。否则你很难有信心继续。

我来回复

您尚未登录,请登录后再回复。点此登录或注册