Socket通信学习(套字接)
Socket通信主要分两种:TCP协议和UDP协议
TCP:Transmission Control Protocol
UDP:User Datagram Protocol
TCP/IP四层参考模型从上到下可分为四层:
4、应用层(Application):为用户提供所需要的各种服务
3、传输层(Transport):为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性
2、网际层(Internet):主要解决主机到主机的通信问题
1、网络接口层(Network Access):负责监视数据在主机和网络之间的交换
还有一种是五层协议的体系结构,是专门为介绍网络原理而设计的,与TCP/IP四层模型唯一不同的就是将网络接口层分为了数据链路层和物理层,在实际的应用中还是使用TCP/IP四层模型的。
TCP和UDP协议在传输层实现。
- 连接路由器,由于路由器开启了ap隔离,所以连接同一个wifi的电脑之间无法ping通,路由器关闭ap隔离就行了。
- 查看两个ip是否在同一个网段
如:
将ip4地址变成二进制
192.168.31.252
11000000.10101000.00011111.11111100
192.168.31.139
11000000.10101000.00011111.10001011
255.255.255.0
11111111.11111111.11111111.00000000
192.168.31.252和255.255.255.0做与操作
11000000.10101000.00011111.00000000
192.168.31.139和255.255.255.0做与操作
11000000.10101000.00011111.00000000
故192.168.31.252和192.168.31.139 在同一个网段
客户端和服务端代码:
客户端 tcp+udp
#include <iostream>
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
//using namespace std;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
//TCP协议
//客户端主要三个操作
//socket,connect,send
//创建socket
//SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
创建连接
服务端的ip地址和端口号保持正确
//sockaddr_in serveraddr;
//serveraddr.sin_family = AF_INET;
//serveraddr.sin_port = htons(12345);
//serveraddr.sin_addr.s_addr = inet_addr("10.82.16.10");
//err = connect(client, (sockaddr*)&serveraddr, sizeof(serveraddr));
//int num = WSAGetLastError();
//std::cout << err << std::endl;
//std::cout << "connect....." << std::endl;
发送消息
//err = send(client, "hello", sizeof("hello"), 0);
//std::cout << err << std::endl;
//std::cout << "send....." << std::endl;
//TCP协议
//UDP协议
SOCKET client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//创建连接
//服务端的ip地址和端口号保持正确
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(12345);
serveraddr.sin_addr.s_addr = inet_addr("10.82.16.10");
//发送消息
err = sendto(client, "hello", sizeof("hello"), 0, (sockaddr*)&serveraddr, sizeof(serveraddr));
std::cout << err << std::endl;
std::cout << "send....." << std::endl;
//UDP协议
WSACleanup();
std::cout << "Hello World!\n";
}
服务端 tcp+udp
#include <iostream>
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
//服务器socket通信
//using namespace std;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
/TCP传输
//五个步骤
//socket、bing、listen、accept、recv
//tcp传输
//ipv4和tcp协议
//创建套接字
//SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//
绑定信息,需要地址信息
//sockaddr_in serveraddr;
//serveraddr.sin_family = AF_INET;
htons的作用是
//serveraddr.sin_port = htons(12345);
//serveraddr.sin_addr.s_addr = inet_addr("10.82.16.10");
//err = bind(server,(sockaddr*)&serveraddr,sizeof(serveraddr));
监听客户机传来的消息
//err = listen(server, 5);
//std::cout << "listen...." << std::endl;
处理连接请求
//sockaddr_in clientaddr;
//int len = sizeof(clientaddr);
//SOCKET client = accept(server, (sockaddr*)&clientaddr, &len);
接受客户机的消息
//char recvdata[1024] = { 0 };
为了防止溢出,设置成1023
//recv(client, recvdata,1023,0);
//std::cout << recvdata << std::endl;
/TCP传输
/UDP传输
//创建套接字
SOCKET server = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//绑定信息,需要地址信息
sockaddr_in serveraddr,clientaddr;
serveraddr.sin_family = AF_INET;
//htons的作用是
serveraddr.sin_port = htons(12345);
serveraddr.sin_addr.s_addr = inet_addr("10.82.16.10");
err = bind(server, (sockaddr*)&serveraddr, sizeof(serveraddr));
接受客户机的消息
char recvdata[1024] = { 0 };
//len一定要 =sizeof(clientaddr),不然无法通过recvfrom =-1;
int len =sizeof(clientaddr);
while (1)
{
if (recvfrom(server, recvdata, 1023, 0, (sockaddr*)&clientaddr, &len) != -1)
{
std::cout << recvdata << std::endl;
}
}
std::cout << recvdata << std::endl;
/UDP传输
WSACleanup();
std::cout << "Hello World!\n";
}