当前位置: 首页 > article >正文

C++ socket编程(1)

这里是一个socket编程Demo,不考虑出错情况,代码简单,便于了解socket流程。

Demo分为服务器程序和客户端程序,运行需要先启动服务器程序,再启动客户端程序。

服务器会等待连接,客户端连接后,服务发送"connected."给客户端。

然后客户端会与服务器进行10次交互,一个交互为:客户端发一个消息,服务器收到,原样返回给客户端,客户端收到,再发下一个消息。

10次交互完成,关闭链接,两边程序都结束。

服务器程序:

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>

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

#define SOCKET_ADDR "127.0.0.1"
#define SOCKET_PORT 1234

int main()
{
    WSADATA wsaData;
    WSAStartup( MAKEWORD(2, 2), &wsaData);

    SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct sockaddr_in sockAddr;
    memset(&sockAddr, 0, sizeof(sockAddr));
    sockAddr.sin_family = PF_INET;
    inet_pton(AF_INET, SOCKET_ADDR, &sockAddr.sin_addr.s_addr);
    sockAddr.sin_port = htons(SOCKET_PORT);
    bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));

    listen(servSock, 1);

    SOCKADDR clntAddr;
    int nSize = sizeof(SOCKADDR);
    SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);

    const char *str = "connected.";
    send(clntSock, str, strlen(str)+sizeof(char), NULL);

    int i = 10;
    char szBuffer[MAXBYTE] = { 0 };
    while (i != 0)
    {
        memset(szBuffer, 0, MAXBYTE);
        recv(clntSock, szBuffer, MAXBYTE, NULL);
        std::cout << szBuffer << std::endl;
        send(clntSock, szBuffer, strlen(szBuffer)+ sizeof(char), NULL);
        --i;
    }

    closesocket(clntSock);
    closesocket(servSock);

    WSACleanup();

    return 0;
}

客户端程序:

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")

#define SOCKET_ADDR "127.0.0.1"
#define SOCKET_PORT 1234

int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct sockaddr_in sockAddr;
    sockAddr.sin_family = PF_INET;
    inet_pton(AF_INET, SOCKET_ADDR, &sockAddr.sin_addr.s_addr);
    sockAddr.sin_port = htons(SOCKET_PORT );
    connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));

    char szBuffer[MAXBYTE] = {0};
    recv(sock, szBuffer, MAXBYTE, NULL);
    std::cout << szBuffer << std::endl;

    int i = 10;
    while (i != 0)
    {
        snprintf(szBuffer, MAXBYTE, "Index:%d", i);
        send(sock, szBuffer, strlen(szBuffer) + sizeof(char), NULL);
        std::cout << "send:" << szBuffer << std::endl;
        memset(szBuffer, 0, MAXBYTE);
        recv(sock, szBuffer, MAXBYTE, NULL);
        std::cout << "recv:" << szBuffer <<std::endl;
        --i;
    }

    closesocket(sock);

    WSACleanup();

    return 0;
}

客户端运行后输出:

connected.
send:Index:10
recy:Index:10
send:Index:9
recy:Index:9
send:Index:8
recy:Index:8
send:Index:7
recy:Index:7
send:Index:6
recy:Index:6
send:Index:5
recy:Index:5
send:Index:4
recy:Index:4
send:Index:3
recy:Index:3
send:Index:2
recy:Index:2
send:Index:1
recy:Index:1

两个程序在VS2019上编译运行通过。

主要交互在while里, 客户端这边是(发,收),服务器这边是(收, 发)。

Linux的socket与Windows类似,区别如下:

1.socket类型不同,

Windows: SOCKET(unsigned __int64)

Linux: int

2.收发函数不同:

Windows: recv/send

Linux: read/write

3.关闭socket不同:

Windows: closesocket(socket)

Linux: close(socket)


http://www.kler.cn/news/342730.html

相关文章:

  • 你知道C++多少——栈和队列
  • Pr 视频效果:元数据和时间码刻录
  • 数据仓库拉链表
  • 7.并发编程之并发安全问题
  • 【Linux】Linux 环境变量中 LOGNAME 和 USER 有什么本质区别
  • 通义灵码-----阿里巴巴推出的 AI 编程助手,一站式安装使用教程。 我自己就是在用,感觉写代码会高效很多
  • 基于STM32的智能门锁
  • 日志分析(二)
  • 洗衣店订单处理:Spring Boot系统的优势
  • 【黑马点评】6 秒杀优化并用Apifox添加优惠券信息
  • 数据结构_day1
  • 怎么找矩阵系统,怎么源码搭建,源头技术开发需要哪些支持
  • 华为Nova12活力版nova 11,FIN-AL60/FOA-AL00手机忘记密码到底怎么解锁无法激活设备已锁定平台工具软件固件使用解决方案
  • 大家觉得我这个产品点子怎样,能打造出爆品吗
  • Rust编程的函数
  • Spring异步线程池的问题
  • 多模态大语言模型(MLLM)-Blip2深度解读
  • SQL 干货 | 使用 EXISTS 编写 SELECT 查询
  • LeetCode 3311. 构造符合图结构的二维矩阵
  • Pr 视频效果:元数据和时间码刻录 - 元数据