套接字通信

发布时间 2023-10-25 12:46:30作者: LiviaYu

服务器端

#include <cstdio>
#include<arpa/inet.h>
#include<iostream>
#include<unistd.h>

using namespace std;



int main()
{
    printf("%s 向你问好!\n", "SocketLinnx");
    //1.创建监听的套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1)
    {
        perror("socket");
        return -1;
    }
    //2.绑定本地端口
    //2.1   addr结构体的初始化和地址
    sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr = INADDR_ANY;//指定为0后,自动读取实际ip
    int ret = bind(fd,(sockaddr *) &saddr, sizeof(saddr));
    if (ret == -1)
    {
        perror("bind");
        return -1;
    }
    //3.设置监听
    ret = listen(fd, 128);
    if (ret == -1)
    {
        perror("bind");
        return -1;
    }
    //4.阻塞并等待客户端连接
    struct sockaddr_in caddr;
    int addrlen = sizeof(caddr);
    int cfd = accept(fd, (struct sockaddr*)&caddr, (socklen_t*)& addrlen);
    if (cfd == -1)
    {
        perror("accept");
        return -1;
    }
    //建立连接成功,打印客户端IP和端口
    //caddr是大端信息,需要转成小端输出
    char ip[32];
    printf("客户端IP:%s ,端口:&d\n", inet_ntop(AF_INET,&caddr.sin_addr.s_addr,ip,sizeof(ip)),ntohs(caddr.sin_port));
    //5.进行通信
    while (true)
    {
        //接收数据
        char buff[1024];
        int len = recv(cfd, buff, sizeof(buff), 0);
        if (len > 0)
        {
            cout << buff << endl;
            send(cfd, buff, len, 0);
        }
        else if (len == 0)
        {
            cout << "客户端断开连接" << endl;
            break;
        }
        else {
            perror("recv");
            break;
        }
    }
    //释放文件描述符
    close(cfd);
    close(fd);
    return 0;
}

客户端(由于接口不同,部分函数不同)

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

using namespace std;


int main()
{
    // 初始化套接字库
    WSAData wsa;
    WSAStartup(MAKEWORD(2, 2), &wsa);

    //1.创建通信的套接字
    SOCKET fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (fd == -1)
    {
        perror("socket");
        return -1;
    }
    //2.连接服务器
    sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    inet_pton(AF_INET, "120.79.224.46", &saddr.sin_addr.s_addr);
    //saddr.sin_addr.s_addr = inet_addr("120.79.224.46");//指定为0后,自动读取实际ip
    int ret = connect(fd,(sockaddr*)&saddr,sizeof(saddr));
    if (ret == -1)
    {
        perror("connect");
        return -1;
    }
    
    //5.进行通信
    int number = 0;
    while (true)
    {
        //发送数据
        char buff[1024];
        
        sprintf_s(buff, "cnsm,服务器,NUM: %d...\n", number++);

        send(fd, buff, strlen(buff)+1, 0);

        //接收数据
        memset(buff, 0, sizeof(buff));
        int len = recv(fd, buff, sizeof(buff), 0);
        if (len > 0)
        {
            cout << "server says: " << buff << endl;
        }
        else if (len == 0)
        {
            cout << "server close" << endl;
        }
        else
        {
            perror("recv");
            break;
        }
        Sleep(1);
        
    }
    //释放文件描述符
    WSACleanup();
    closesocket(fd);
    return 0;
}