⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cwsbook.txt

📁 介绍window下socket编程的一本好书
💻 TXT
📖 第 1 页 / 共 5 页
字号:
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	PostMessage(hWnd, WM_USER, (WPARAM)0, (LPARAM)0);
	while (GetMessage(&msg, NULL, NULL, NULL))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (msg.wParam);
}

BOOL InitApplication(HINSTANCE hInstance)
{
    WNDCLASS WndClass;

	char *szAppName = "ClientClass";
    // fill in window class information

	WndClass.lpszClassName = (LPSTR)szAppName;
	WndClass.hInstance     = hInstance;
	WndClass.lpfnWndProc   = ClientProc;
	WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
	WndClass.hIcon         = LoadIcon(hInstance, NULL);
	WndClass.lpszMenuName  = "ClientMenu";
	WndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
	WndClass.style         = CS_HREDRAW | CS_VREDRAW;
	WndClass.cbClsExtra    = 0;
	WndClass.cbWndExtra    = 0;

    // register the class

    if (!RegisterClass(&WndClass))
		return(FALSE);

    return(TRUE);
}

long FAR PASCAL ClientProc(HWND hWnd, unsigned message, UINT wParam, LONG 
lParam)
{
	int length, i;
	WSADATA wsaData;

	int Status;

	switch (message)
	{
		case WM_USER:
		{
			WORD	wMajorVersion, wMinorVersion;
			LPWSADATA	lpmyWSAData;
			WORD 		VersionReqd;
			int			ret;

			wMajorVersion = MAJOR_VERSION;
			wMinorVersion = MINOR_VERSION;
			VersionReqd = WSA_MAKEWORD(wMajorVersion,wMinorVersion);
		
			lpmyWSAData = (LPWSADATA)malloc(sizeof(WSADATA));
			Status = WSAStartup(VersionReqd, lpmyWSAData);
			if (Status != 0)
			{
				AlertUser(hWnd, "WSAStartup() failed\n");
				PostQuitMessage(0);
			}
			hostaddr = gethostbyname(server_address);
			if (hostaddr == NULL)
			{
				AlertUser(hWnd, "gethostbyname ERROR!\n");
				WSACleanup();
				PostQuitMessage(0);
			}
			_fmemcpy(&hostnm, hostaddr, sizeof(struct hostent));
		}
			break;
		case WM_COMMAND:
			switch (wParam)
			{
				case IDM_START:
					if (!Client(hWnd))
					{
						closesocket(s);
						AlertUser(hWnd, "Start Failed");
					}
					break;
				case IDM_EXIT:
//					WSACleanup();
					PostQuitMessage(0);
					break;
			}
			break;
		case UM_SOCK:
			switch (lParam)
			{
				case FD_CONNECT:
					if (!SetSelect(hWnd, FD_WRITE))
						closesocket(s);
					break;
				case FD_READ:
					if (!ReceivePacket(hWnd))
					{
						AlertUser(hWnd, "Receive Packet Failed.\n");
						closesocket(s);
						break;
					}
					if (!SetSelect(hWnd, FD_WRITE))
						closesocket(s);
					break;
				case FD_WRITE:
					for (i = 0; i < 1024; i ++)
						buffer[i] = (char)'A' + i % 26;
					length = 1024;
					if (!SendPacket(hWnd, length))
					{
						AlertUser(hWnd, "Packet Send Failed!\n");
						closesocket(s);
						break;
					}
					if (!SetSelect(hWnd, FD_READ))
						closesocket(s);
					break;
				case FD_CLOSE:
					if (WSAAsyncSelect(s, hWnd, 0, 0) == SOCKET_ERROR)
						AlertUser(hWnd, "WSAAsyncSelect Failed.\n");
					break;
				default:
					if (WSAGETSELECTERROR(lParam) != 0)
					{
						AlertUser(hWnd, "Socket Report Failure.");
						closesocket(s);
						break;
					}
					break;
            }
			break;
		case WM_DESTROY:
			closesocket(s);
			WSACleanup();
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd, message, wParam, lParam));
	}
	return(NULL);
}

void AlertUser(HWND hWnd, char *message)
{
	MessageBox(hWnd, (LPSTR)message, "Warning", MB_ICONEXCLAMATION);
	return;
}

BOOL Client(HWND hWnd)
{
	memset(&dst_addr,'\0', sizeof (struct sockaddr_in));
	_fmemcpy((char  FAR *)&dst_addr.sin_addr,(char  FAR 
*)hostnm.h_addr,hostnm.h_length);
	dst_addr.sin_family = hostnm.h_addrtype;
	dst_addr.sin_port = htons(USERPORT);
	if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
	{
		AlertUser(hWnd, "Socket Failed");
		return (FALSE);
	}
	if (!SetSelect(hWnd, FD_CONNECT))
		return (FALSE);
	connect(s, (struct sockaddr FAR *)&dst_addr, sizeof(dst_addr));
	return (TRUE);
}


BOOL ReceivePacket(HWND hWnd)
{
	HDC hDc;
	int length;
	int i1,i2,i3;
	char line1[255], line2[255], line3[255];

	count ++;
	if ((length = recv(s, lpBuffer, 1024, 0)) == SOCKET_ERROR)
		return (FALSE);
	if (length == 0)
		return (FALSE);
	if (hDc = GetDC(hWnd))
	{
		i1 = wsprintf((LPSTR)line1, "TCP Echo Client No.%d", count);
		i2 = wsprintf((LPSTR)line2, "Receive %d bytes",length);
		i3 = wsprintf((LPSTR)line3, "Those are:%c, %c, %c, %c, %c, 
%c",buffer[0],buffer[1],buffer[2],buffer[100],buffer[1000],buffer[1023]);
		TextOut(hDc, 10, 2, (LPSTR)line1, i1);
		TextOut(hDc, 10, 22, (LPSTR)line2, i2);
		TextOut(hDc, 10, 42, (LPSTR)line3, i3);
		ReleaseDC(hWnd, hDc);
	}
	return (TRUE);
}
                                                                    
BOOL SetSelect(HWND hWnd, long lEvent)
{
	if (WSAAsyncSelect(s, hWnd, UM_SOCK, lEvent) == SOCKET_ERROR)
	{
		AlertUser(hWnd, "WSAAsyncSelect Failure.");
		return (FALSE);
	}
	return (TRUE);
}

BOOL SendPacket(HWND hWnd, int len)
{
	int length;

	if ((length = send(s, lpBuffer, len, 0)) == SOCKET_ERROR)
		return (FALSE);
	else
	if (length != len)
	{
		AlertUser(hWnd, "Send Length NOT Match!");
		return (FALSE);
	}
	return (TRUE);
}

程序3:SERVER.C
#include <sys/types.h>
#include <sys/mntent.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define USERPORT 10001
#define HOST_IP_ADDR "192.1.1.2"

main(int argc, char **argv)
{
	char buf[1024];
	struct sockaddr_in client;
	struct sockaddr_in server;

	int s;
	int ns;
	int namelen;
	int pktlen;
	
	if ((s=socket(AF_INET, SOCK_STREAM, 0))<0)
	{
		perror("Socket()");
		return;
	}
	bzero((char *)&server,sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(USERPORT);
	server.sin_addr.s_addr = INADDR_ANY;
	if (bind(s, (struct sockaddr *)&server, sizeof(server))<0)
	{
		perror("Bind()");
		return;
	}
	if (listen(s,1)!=0)
	{
		perror("Listen()");
		return;
	}
	namelen = sizeof(client);
	if ((ns = accept(s, (struct sockaddr *)&client, &namelen)) ==-1)
	{
		perror("Accept()");
		return;
	}
	for (;;)
	{
		if ((pktlen = recv(ns,buf,1024,0))<0)
		{
			perror("Recv()");
			break;
		}
		else
		if (pktlen == 0)
		{
			printf("Recv():return FAILED,connection is shut down!\n");
			break;
		}
		else
			printf("Recv():return SUCCESS,packet length = %d\n",pktlen);
		sleep(1);
		if (send(ns,buf,pktlen,0)<0)
		{
			perror("Send()");
			break;
		}
		else
			printf("Send():return SUCCESS,packet length = %d\n",pktlen);
	}
	close(ns);
	close(s);
	printf("Server ended successfully\n");
}

3.4 另一个精巧的应用程序实例-wshout
    在本节中,我们通过一个经过精心选择的例子,进一步讨论一下Windows 
Sockets编程技术。例如如何编制客户机或服务器程序,如何应用TCP有连接服务
(流式套接口)或UDP无连接服务(数据报套接口),如何进行阻塞或非阻塞方式
的套接口操作等等,这些都是经常碰到的问题。接下来要介绍的wshout程序,可以
通过灵活地设置不同选项来达到上述应用情况的任意组合,从而基本覆盖了应用
Windows Sockets编程所可能碰到的问题,具有很好的研究参考价值。
    由于该程序思路清晰,结构精良,所以我们不打算很详细地剖析每一个语句,
而只是简要介绍一下整个程序的逻辑结构,并在源程序中加入适当的注释。我们相
信,任何具有基本C语言和Windows编程经验的读者,都能很轻松地读懂绝大部分

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -