基于窗口的TCP简单编程
- 主要流程:
- 在服务端用一个窗口来处理接受到的消息,显示在窗口中的列表框中。
- 主要函数:
DialogBoxParamA (
hInstance,
(LPCSTR) IDD_DIALOG1,
NULL,
DlgProc,
0
);
实例化对话框。
int CreateListenSocket ();//创建socket
int DealSocketEvent (WPARAM wparam,LPARAM lparam);//处理socket
SendMessage (MyList, LB_ADDSTRING, NULL, (long)"初始化了......");//向列表框添加字符串
- 源码:
#include <WinSock2.h>
#include "resource.h"
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define WM_SOCKET (WM_USER + 101)
#define MAXDATASIZE 100
#define BACKLOG 10
SOCKET server;
char buf[MAXDATASIZE];
BOOL WINAPI DlgProc (HWND hDlg, UINT message, WPARAM wparam, LPARAM lparam);
int CreateListenSocket ();
int DealSocketEvent (WPARAM wparam,LPARAM lparam);
HWND MyList;
HWND MyDlg;
char szLText[] = "你按了鼠标左键";
char szOKText[] = "你按下了OK按钮!";
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
DialogBoxParamA (
hInstance,
(LPCSTR) IDD_DIALOG1,
NULL,
DlgProc,
0
);
return 0;
}
BOOL WINAPI DlgProc (HWND hDlg, UINT message, WPARAM wparam, LPARAM lparam)
{
switch (message)
{
case WM_INITDIALOG:
{
MyList = GetDlgItem (hDlg, IDC_LIST1);
MyDlg = hDlg;
SendMessage (MyList, LB_ADDSTRING, NULL, (long)"初始化了......");
CreateListenSocket ();
}
break;
case WM_SOCKET:
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)"正在处理Socket......");
DealSocketEvent (wparam,lparam);
break;
case WM_LBUTTONDOWN:
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)szLText);
break;
case WM_RBUTTONDOWN:
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)"你按下了鼠标右键!");
break;
case WM_COMMAND:
switch (LOWORD (wparam))
{
case IDOK:
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)szOKText);
break;
case IDCANCEL:
EndDialog (hDlg, IDCANCEL);
break;
}
default:
break;
}
return 0;
}
int CreateListenSocket ()
{
WSADATA wsadata;
SOCKADDR_IN serveraddr;
int result;
WSAStartup (MAKEWORD (2, 2), &wsadata);
server = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons (9090);
serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
result = bind (server, (struct sockaddr*)&serveraddr, sizeof (struct sockaddr));
if (result < 0) {
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)"绑定错误");
return -1;
}
result = listen (server, BACKLOG);
if (result == SOCKET_ERROR) {
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)"监听错误");
}
WSAAsyncSelect (server,MyDlg,WM_SOCKET,FD_ACCEPT|FD_CLOSE|FD_READ);
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)"创建SOCKET完成");
return 0;
}
int DealSocketEvent (WPARAM wparam, LPARAM lparam)
{
SOCKET s = (SOCKET)wparam;
SOCKADDR_IN addrclient;
int len = sizeof (addrclient);
if (WSAGETSELECTERROR (lparam))
{
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)"套接字错误");
closesocket (s);
return -1;
}
else {
switch (WSAGETSELECTEVENT (lparam))
{
case FD_ACCEPT:
{
SOCKET client = accept (s, (sockaddr FAR*)&addrclient, &len);
WSAAsyncSelect (client, MyDlg, WM_SOCKET, FD_READ | FD_CLOSE | FD_WRITE);//这里的client是在服务端的要与客户端通信的套接字,而s则是发生事件的套接字。
}
break;
case FD_CLOSE:
closesocket (s);
break;
case FD_READ:
{
int ret = recv (s, buf, sizeof (buf), 0);
buf[ret] = '\0';
SendMessage (MyList, LB_INSERTSTRING, NULL, (long)buf);
send (s, buf, 100, 0);
}
break;
}
}
return 0;
}
- 运行截图: