socket通信 tcp协议和udp协议 C++

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协议在传输层实现。

  1. 连接路由器,由于路由器开启了ap隔离,所以连接同一个wifi的电脑之间无法ping通,路由器关闭ap隔离就行了。
  2. 查看两个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";
}

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值