实现简单的网络通讯

目录

IP地址简介:

服务器端:

 客户端:

提示:


IP地址简介:

一台联网设备的 IP地址 就像是它的身份证号,组成身份证号的各个数字有以下意义:

第1、2位数字表示:所在省份的代码;第3、4位数字表示:所在城市的代码;第5、6位数字表示:所在区县的代码;第7~14位数字表示:出生年、月、日;第15~17位数字为顺序码,表示同一区域内同年同月同日出生的顺序号,其中第17位数字表示性别,奇数表示男性,偶数表示女性;第18位数字是校检码。

可以看到,在没见到本人,只知道你的身份证号的情况下,通过前六位数字,我们可以确定你的出生地址,精确到区县;而通过之后的数字,我们可以确定你的出生日期以及你的性别。

同样地,IP地址有类似的作用:

IP地址的数字前面部分代表网络号也就网络地址,后面部分代表主机号也就是主机地址,至于哪些代表网络号就需要看子网掩码了。所以ip地址的数字含义是需要根据子网掩码判断的。就像快递地址一样,为了相互快递东西,也就是传递数据。 

那怎么获取本机的 IP 地址呢?

首先,网络上搜索 IP 会有实现简单的网络通讯

不过,这样得到的 IP 地址用不了,接下来介绍另一种获取本机 IP 地址的方法:

在空白桌面按下 win键+R键 ,桌面左下角会有窗口跳出,实现简单的网络通讯

输入 "cmd",点击确定,跳出控制台窗口,实现简单的网络通讯

再输入 "ipconfig",按下 Enter键 就得到了我们要的结果:

实现简单的网络通讯

 图片对于一些隐秘信息进行了擦除,可以看到 IPv4 地址即是我们需要的 IP 地址。

图中的 IPv4 地址是以点分十进制表示出来的,这指的是IPv4地址本身共有32个二进制位表示,将8个二进制位划为一组后得到四组,每组用十进制表示出来,每组之间用点分开,得到的便是IP地址的点分十进制形式

服务器端:

//服务器端
#include<stdio.h>
#include<winsock.h>
int main()
{
	char Sendbuf[100];
	char Receivebuf[100];
	int SendLen;
	int ReceiveLen;
	int Length;

	SOCKET socket_server;
	SOCKET socket_receive;

	SOCKADDR_IN Server_add;
	SOCKADDR_IN Client_add;

	WORD wVersionRequested;
	WSADATA wsaData;
	int error;

	wVersionRequested = MAKEWORD(2, 2);
	error = WSAStartup(wVersionRequested, &wsaData);
	if (error != 0)
	{
		printf("加载套接字失败!");
		return 0;
	}
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		WSACleanup();
		return 0;
	}
	Server_add.sin_family = AF_INET;
	Server_add.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	Server_add.sin_port = htons(5000);
	socket_server = socket(AF_INET, SOCK_STREAM, 0);

	if (bind(socket_server, (SOCKADDR*)&Server_add, sizeof(SOCKADDR)) == SOCKET_ERROR)
	{
		printf("绑定失败\n");
	}

	if (listen(socket_server, 5) < 0)
	{
		printf("监听失败\n");
	}

	Length = sizeof(SOCKADDR);
	socket_receive = accept(socket_server, (SOCKADDR*)&Client_add, &Length);
	if (socket_receive == SOCKET_ERROR)
	{
		printf("接受连接失败");
	}
	while (1)
	{
		ReceiveLen = recv(socket_receive, Receivebuf, 100, 0);
		if (ReceiveLen < 0)
		{
			printf("接收失败\n");
			printf("程序退出\n");
			break;
		}
		else
		{
			printf("client says: %s\n", Receivebuf);
		}

		printf("please enter message:");
		scanf("%s", Sendbuf);
		SendLen = send(socket_receive, Sendbuf, 100, 0);
		if (SendLen < 0)
		{
			printf("发送失败\n");
		}
	}
	closesocket(socket_receive);
	closesocket(socket_server);
	WSACleanup();
	return 0;
}

 客户端:

//客户端
#include<stdio.h>
#include<winsock.h>
int main()
{
	char Sendbuf[100];
	char Receivebuf[100];
	int SendLen;
	int ReceiveLen;

	SOCKET socket_send;
	SOCKADDR_IN Server_add;

	WORD wVersionRequested;
	WSADATA wsaData;
	int error;

	wVersionRequested = MAKEWORD(2, 2);
	error = WSAStartup(wVersionRequested, &wsaData);
	if (error != 0)
	{
		printf("加载套接字失败!");
		return 0;
	}

	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		WSACleanup();
		return 0;
	}

	Server_add.sin_family = AF_INET;
	Server_add.sin_addr.S_un.S_addr = inet_addr("192.122.0.104");
    //各位博友注意:192.122.0.104 只是一个博主随便写的 IP地址,此处的IP地址各位博友
    //可以自己通过上面的方法得到自己PC机的IP地址,通过这个,各位博友能够实现自己同时
    //是客户端和服务器端。
	Server_add.sin_port = htons(5000);
	socket_send = socket(AF_INET, SOCK_STREAM, 0);

	if (connect(socket_send, (SOCKADDR*)&Server_add, sizeof(SOCKADDR)) == SOCKET_ERROR)
	{
		printf("连接失败\n");
	}

	while (1)
	{
		printf("please enter message:");
		scanf("%s", Sendbuf);
		SendLen = send(socket_send, Sendbuf, 100, 0);
		if (SendLen < 0)
		{
			printf("发送失败\n");
		}
		ReceiveLen = recv(socket_send, Receivebuf, 100, 0);
		if (ReceiveLen < 0)
		{
			printf("接受失败\n");
			printf("程序退出\n");
			break;
		}
		else
		{
			printf("Server says: %s\n", Receivebuf);
		}
	}
	closesocket(socket_send);
	WSACleanup();
	return 0;
}

提示:

我们的客户端是要用到 IP地址的,至于在哪里要用到,在客户端的代码中已有注释。以上的代码需各位博友建在两个项目里需要开两个执行界面,否则会引起冲突,切记切记。

另外,还需各位博友自己在两个项目的属性一栏中有所操作才能使用,步骤如下:

实现简单的网络通讯

 点击后出现一个窗口,点击链接器一栏旁边的三角形,再点击下属项输入,之后再点击页面中的附加依赖项一栏,点击右边的小箭头,然后点击编辑,大概图样如下:实现简单的网络通讯

 之后出现界面:实现简单的网络通讯

 记得输入 "ws2_32.lib" ,点击确定,就大功告成了。

执行程序时,先执行服务器端,再执行客户端。

 如果有的博友发现电脑仍然出现运行不了,建议先确认 IP地址 是自己的电脑的,并且以点分十进制形式正确输入;如果这没问题,建议看一下编译器类型,博主用的是VS2017, VS系列估计没问题,其它的如 Dev-C++ 应该也没问题;如果仍然不行,直接在网上搜索下载 ws2_32.lib 这个动态库文件。

放几张成功运行程序后的图片:

 实现简单的网络通讯

在未执行客户端程序之前,服务器端程序执行后的控制台画面如上是空白的,接下来启动客户端程序,客户端程序执行后的画面是这样的: 实现简单的网络通讯

 我们在客户端输入信息:实现简单的网络通讯

 服务器端接收到信息的画面为:实现简单的网络通讯

 我们继续在服务器端输入信息:

实现简单的网络通讯

在客户端会得到回信:

实现简单的网络通讯

 这样,简单的话语交流功能就算是完成了。


欢迎指正我的上一篇博客:函数×指针(C语言)

我的下一篇博客:待续

上一篇:【javscript30天挑战之】Day1------Drum kit


下一篇:CoinGecko已收录链游平台Dontplaywithkitty.io平台双通证之一KIT