Soket通信学习(一):创建服务端和客户端并建立简单的通信

本文详细介绍了在Ubuntu开发环境中,如何通过C++实现服务端和客户端的socket编程,包括创建socket、设置地址、绑定、监听、连接、收发消息以及关闭连接的过程。
摘要由CSDN通过智能技术生成

        这篇文章不详细说socket的基础理论直接聚焦代码方面的实操,毕竟刚刚开始学这个的时候还是得先上手后才能更好的去理解背后的原理和知识。一般的工作中也是要求先使用后去理解。

(开发/编译环境:ubuntu )

1.服务端:

        服务端我我们需要先完成的代码,整个的过程如下:

        1.创建sokcet。socket()        

        2.设置地址。struct sockaddr_in service_addr;

        3.绑定。bind();

        4.监听。listen();

        5.链接。accept();

        6.收发消息。read()/send()

        7.关闭sokcet。close

接下来我们直接看服务端的代码->service_socket.cpp:

#include<iostream>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string>
#include<unistd.h>
int main(){
    int service_fd,new_socket;
    struct sockaddr_in service_addr;
    char buffer[1024] = {0};

    //创建socket
    std::cout<<"creator socket\n";
    service_fd = socket(AF_INET,SOCK_STREAM,0);
    if(service_fd < 0){
        std::cout<<"creator socket failed"<<std::endl;
        return 1;
    }
    //设置地址
    service_addr.sin_family = AF_INET;
    service_addr.sin_addr.s_addr = INADDR_ANY;
    service_addr.sin_port = htons(8080);
    std::cout<<"bind\n";
    //绑定
    int bind_ret = bind(service_fd,(struct sockaddr*)&service_addr,sizeof(service_addr));
    if(bind_ret < 0){
        std::cout<<"bind failed\n";
        return 1;
    }
    std::cout<<"listen\n";
    //监听
    if(listen(service_fd,10) < 0){
        std::cout<<"listen failed";
        return 1;
    }
    //链接
    std::cout<<"accept\n";
    socklen_t addr_len = sizeof(service_addr);
    while(1){
        new_socket = accept(service_fd,(struct sockaddr*)&service_addr,&addr_len);
        if(new_socket < 0){
            std::cout<<"accept failed\n";
            continue;
        }else{
            std::cout<<"accept success\n";
            break;
        }
    }
    //接受消息
    std::cout<<"read msg\n";
    int read_ret = read(new_socket,buffer,sizeof(buffer));
    //printf("ret size is %d,msg is %s\n",read_ret,buffer);
    std::cout<<"rer size is "<<read_ret<<"msg from client is"<<buffer<<std::endl;
    //发送消息
    std::cout<<"send msg\n";
    std::string send_msg = "hello client,this is service";
    send(new_socket,send_msg.c_str(),send_msg.size(),0);
    //关闭连接
    usleep(5000*1000);
    std::cout<<"close socket\n";
    close(new_socket);
    close(service_fd);
    return 1;
}

这里额外介绍下设置地址这块:struct sockaddr_in service_addr:

    sin_family:表示地址族,通常为AF_INET(IPv4)
    sin_port:表示端口号,使用无符号短整型表示,范围为0到65535
    sin_addr:是一个"struct in_addr"类型的结构体,用于表示IPv4地址。
    sin_zero:是一些填充字节,用于使得sockaddr_in。

2.客户端:

        客户端的代码的过程如下:

        1.创建socket。socket()        

        2.设置地址。struct sockaddr_in service_addr;

        3.链接。connect()

        4.收发消息。read()/send()

        5.关闭链接。close()

        客户端的完整代码如下->client_socket:

#include<iostream>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string>

int main(){
    int client_fd;
    struct sockaddr_in client_addr;
    char buffer[1024];

    //创建socket
    std::cout<<"Creating socket..."<<std::endl;
    client_fd = socket(AF_INET,SOCK_STREAM,0);
    if(client_fd < 0){
        std::cout<<"creator socket failed\n";
        return 1;
    }
    //设置地址
    client_addr.sin_family = AF_INET;
    client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    client_addr.sin_port = htons(8080);

    //链接
    std::cout<<"connect service\n";
    int conncet_ret = connect(client_fd,(struct sockaddr*)&client_addr,sizeof(client_addr));
    if(conncet_ret < 0){
        std::cout<<"connect failed\n";
        return 1;
    }
    //发送消息
    std::cout<<"send message\n";
    std::string send_msg = "hello,server,this is client";
    send(client_fd,send_msg.c_str(),send_msg.length(),0);
    //接收消息
    std::cout<<"get message\n";
    int read_ret = read(client_fd,buffer,sizeof(buffer));
    std::cout<<"read_ret is "<<read_ret<<"get msg is "<<buffer<<std::endl;
    //关闭socket
    std::cout<<"close socket\n";
    close(client_fd);
}

3.运行结果:

        

注意下这里是先运行服务端service_socket,这里的成果物都是要自己编译下才会生成的。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值