[MFC]TCP通信的简单实现

!!以下演示的是一个使用TCP协议的客户端和服务器端实现(即流式套接字),客户端请求连接,服务器端回送给客户端一句话;


1. 服务器端:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>

#pragma comment(lib, "WS2_32.lib") // 如果没有ws2_32.dll则显示链接静态库!!

int main() {

	static const char szAnswerClient[] = "Hello! You've been connected!\n";

	// 启动并初始化Winsock库
	WSADATA data;
	WORD wVersionRequested = MAKEWORD(2, 0);
	WSAStartup(wVersionRequested, &data);

	// 创建一个空的流式套接字(基于TCP)
	SOCKET sLocal;
	sLocal = socket(AF_INET, SOCK_STREAM, 0);
	// 设定本地服务器的地址
	sockaddr_in addrLocal;
	addrLocal.sin_family = AF_INET;
	addrLocal.sin_port = htons(75); // 随意设一个端口
	addrLocal.sin_addr.S_un.S_addr = INADDR_ANY; // 设定成可以接受任何计算机的请求
	
	// 绑定地址并监听
	bind(sLocal, (sockaddr*)&addrLocal, sizeof(addrLocal));
	listen(sLocal, 5);
	printf("Server is setup and now waiting for clients' request...\n"); // 表示服务器已建立好,现等待请求连接

	// 应答的同时获取客户端的套接字
	SOCKET sClient;
	sockaddr_in addrClient;
	int nSockAddrSize = sizeof(addrClient);
	sClient = accept(sLocal, (sockaddr*)&addrClient, &nSockAddrSize);

	// 发送应答信息
	if (sClient) {
		printf("There is one client connected!");
		send(sClient, szAnswerClient, sizeof(szAnswerClient), 0);
	}

	// 关闭套接字资源
	closesocket(sLocal);
	closesocket(sClient);
	
	// 释放Winsock库
	WSACleanup();

	if (getchar()) return 0;
	return 0;
}

2. 客户端:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>

#pragma comment(lib, "WS2_32.lib")

int main() {

	char szRecive[50] = { 0 }; // 用于接受服务器端回送的消息

	WSADATA data;
	WORD wVersionRequested = MAKEWORD(2, 0);
	WSAStartup(wVersionRequested, &data);

	// 指定目标服务器端的地址并建立一个空的套接字,之后用于绑定改地址
	SOCKET sServer;
	sServer = socket(AF_INET, SOCK_STREAM, 0);
	sockaddr_in addrServer;
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(75);
	addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 本地测试使用本地回环地址

	printf("Client is setup and now trying to connect server...\n"); // 表示客户端已准备好,正要请求连接

	// 请求连接的同时绑定套接字
	connect(sServer, (sockaddr*)&addrServer, sizeof(addrServer));
	// 接受客户端的回送消息并打印
	recv(sServer, szRecive, sizeof(szRecive), 0);
	printf(szRecive);

	closesocket(sServer);

	WSACleanup();

	if (getchar()) return 0;
	return 0;
}

!调试的时候先运行服务器端程序,然后再打开客户端程序就能建立连接并应答;


3. 关于本地回环地址:

     1) 一般是指127.X.X.X类型的地址;

     2) 其不属于任何一个有类别的地址(A类、B类等);

     3) 它代表本地虚拟接口,可以不装网卡也能ping通,永远不会宕掉,因此可以用来检查本机网络协议以及网络接口是否正常;

     4) 但是其最大作用就是测试网络通信软件,因为测试通常要求服务器和客户端都在一台计算机上,因此可以用本地回环地址表示服务器地址;

     5) 一般各个不同操作系统指定了不同的本地回环地址,最常见的就是127.0.0.1了,不同平台可能会有所不同,但不过必定属于127.X.X.X段位的;

展开阅读全文

没有更多推荐了,返回首页