实现简单的网络通讯
作者:互联网
目录
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语言)
我的下一篇博客:待续
标签:socket,实现,IP地址,简单,网络通讯,Server,int,add,printf 来源: https://blog.csdn.net/m0_60340015/article/details/122567975