基于窗口的TCP简单编程

基于窗口的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;
}
  • 运行截图:
    无
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值