服务端骨架:
#include "pch.h"
#include "framework.h"
#include "NetServer.h"
#include "NetServerDlg.h"
#include "afxdialogex.h"
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CNetServerDlg::CNetServerDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_NETSERVER_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CNetServerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CNetServerDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_Sock, &CNetServerDlg::OnSock)
END_MESSAGE_MAP()
// CNetServerDlg 消息处理程序
BOOL CNetServerDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
WSADATA lpWSAData;
WSAStartup(MAKEWORD(2, 2), &lpWSAData);
SOCKADDR_IN saddr{ 0 };
saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
saddr.sin_family = AF_INET;
saddr.sin_port = htons(50123);
SOCKET SerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
WSAAsyncSelect(SerSocket, GetSafeHwnd(), WM_Sock, FD_ACCEPT);
bind(SerSocket, (PSOCKADDR)&saddr, sizeof(saddr));
listen(SerSocket, SOMAXCONN);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CNetServerDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
HCURSOR CNetServerDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
afx_msg LRESULT CNetServerDlg::OnSock(WPARAM wParam, LPARAM lParam)
{
SOCKET SerSocket = (SOCKET)wParam;
int Ret = WSAGETSELECTEVENT(lParam);
switch (Ret)
{
case FD_ACCEPT:
{
SOCKET NewSocket = accept(SerSocket, NULL, NULL);
WSAAsyncSelect(NewSocket, GetSafeHwnd(), WM_Sock, FD_READ | FD_WRITE | FD_CLOSE);
break;
}
case FD_READ:
{
char buffer[500] = { 0 };
recv(SerSocket, buffer, sizeof(buffer),0);
MessageBoxA(m_hWnd, buffer, "msg", NULL);
break;
}
case FD_WRITE:
{
CHAR szbuffer[] = "Server!!!";
send(SerSocket, szbuffer, sizeof(szbuffer), 0);
break;
}
case FD_CLOSE:
{
closesocket(SerSocket);
WSACleanup();
break;
}
}
return TRUE;
}
客户端骨架:
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>
int main()
{
WSADATA lpWSAData;
WSAStartup(MAKEWORD(2, 2), &lpWSAData);
SOCKADDR_IN caddr{ 0 };
caddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
caddr.sin_family = AF_INET;
caddr.sin_port = htons(50123);
SOCKET CliSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(CliSocket, (PSOCKADDR)&caddr, sizeof(caddr));
while (true)
{
char buffer[500]{ 0 };
scanf("%s", buffer);
if(send(CliSocket, buffer, strlen(buffer), 0) == SOCKET_ERROR) break;
}
closesocket(CliSocket);
WSACleanup();
system("pause");
return 0;
}