当前位置:首页 » 《资源分享》 » 正文

Socket实现服务器和客户端(手把手教会)

22 人参与  2024年05月01日 09:15  分类 : 《资源分享》  评论

点击全文阅读


? 作者介绍:我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun,视频号:AI-行者Sun
? 本文专栏:本文收录于《网络编程实战》系列专栏,相信一份耕耘一份收获,我会手把手教分享网络编程实战内容,届时可以拳打字节,脚踢腾讯
? 欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。
? 随时欢迎您跟我沟通,一起交流,一起成长、进步!

Socket 编程是一种用于在网络上进行通信的编程方法,以下代码可以实现在不同主机之间传输数据。 

Socket 编程中服务器端和客户端的基本步骤:
服务器端步骤:

1.创建 Socket:

int serverSocket = socket(AF_INET, SOCK_STREAM, 0);

使用 socket 函数创建一个套接字。AF_INET 表示使用 IPv4 地址族。SOCK_STREAM 表示使用 TCP 协议,如果使用 UDP,则为 SOCK_DGRAM。


2.绑定地址和端口:

   struct sockaddr_in serverAddress;   serverAddress.sin_family = AF_INET;   serverAddress.sin_addr.s_addr = INADDR_ANY;   serverAddress.sin_port = htons(PORT);   bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));

初始化服务器地址结构体 sockaddr_in,设置 IP 地址和端口。使用 bind 函数将套接字绑定到指定的地址和端口。


3.监听连接请求:

   listen(serverSocket, BACKLOG);

使用 listen 函数开始监听连接请求。BACKLOG 参数指定连接请求队列的最大长度。


4.接受客户端连接:

   int clientSocket = accept(serverSocket, NULL, NULL);

使用 accept 函数接受客户端的连接请求。返回一个新的套接字 clientSocket,用于与客户端通信。


5.接收和发送数据:
        使用 recv 函数从客户端接收数据,使用 send 函数向客户端发送数据。
关闭连接:

   close(clientSocket);   close(serverSocket);


使用 close 函数关闭连接的套接字。

客户端步骤:

1. 创建 Socket:

  int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
使用 socket 函数创建一个套接字。设置服务器地址和端口:
   struct sockaddr_in serverAddress;   serverAddress.sin_family = AF_INET;   serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP);   serverAddress.sin_port = htons(PORT);

初始化服务器地址结构体 sockaddr_in,设置服务器的 IP 地址和端口。连接到服务器:

  connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
使用 connect 函数连接到服务器。发送和接收数据:使用 send 函数向服务器发送数据,使用 recv 函数从服务器接收数据。关闭连接:
 close(clientSocket);

使用 close 函数关闭连接的套接字。

解决分包、粘包问题

Socket实现模拟TCP通信粘包问题-CSDN博客

Client:

#include <iostream>#include <string>#include <cstring>#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>int main(){    //1.创建socket    int client_sock=socket(AF_INET,SOCK_STREAM,0);    if (client_sock==-1)    {        std::cerr<<"Faild to create socket"<<std::endl;        return -1;    }    //2.连接服务器    struct sockaddr_in server_addr;    server_addr.sin_family=AF_INET;    //server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");    inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);    server_addr.sin_port=htons(9999);    if(connect(client_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1){        std::cerr<<"Faild to connect socket"<<std::endl;        return -1;    }    std::cout<<"Connected to server"<<std::endl;    //3.数据交互    //发送消息        std::string msg="Hello server!\n";    if(write(client_sock,msg.c_str(),msg.length())==-1){        std::cerr<<"Faild to write "<<std::endl;        return -1;    }    //接受消息    char buffer[1024];    if(read(client_sock,buffer,sizeof(buffer))==-1){        std::cerr<<"Faild to read"<<std::endl;        return -1;    }    printf("Receive to server :%s",buffer);    close(client_sock);    }

Server:

#include <iostream>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <cstring>int main(int, char**){    //1.创建套接字    int listen_sock=socket(AF_INET,SOCK_STREAM,0);    if (listen_sock==-1)    {        std::cerr<<"Fiald to create socket"<<std::endl;        return 1;    }        //2.绑定IP地址    struct sockaddr_in server_addr;    memset(&server_addr,0,sizeof(server_addr));    server_addr.sin_addr.s_addr=INADDR_ANY;    server_addr.sin_family=AF_INET;    server_addr.sin_port=htons(9999);    if(bind(listen_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1)    {        std::cerr<<"Fiald to bind socket"<<std::endl;        return 1;    }    //3.监听套接字    if (listen(listen_sock,5)==-1)    {        std::cerr<<"Fiald to listen socket"<<std::endl;        return 1;    }        std::cout<<"server is listening"<<std::endl;    //4.接受客户端的连接    struct sockaddr_in client_addr;    socklen_t client_addr_len=sizeof(client_addr);    int client_sock=accept(listen_sock,(struct sockaddr*)&client_addr,&client_addr_len);    if (client_sock==-1)    {        std::cerr<<"Fiald to accept socket"<<std::endl;        return 1;    }    std::cout<<"a client connected"<<std::endl;    //5.数据交互        //接受消息    char buffer[1024];    int read_size=read(client_sock,buffer,sizeof(buffer));        if (read_size==-1)     {        std::cerr<<"Fiald to read"<<std::endl;        return 1;    }        std::cout<<"Received to client :"<<buffer<<std::endl;    std::string res_msg="Hello Client!";    int wr=write(client_sock,res_msg.c_str(),res_msg.length());    if (wr==-1)    {        std::cerr<<"Fiald to write"<<std::endl;        return 1;    }        close(client_sock);    close(listen_sock);    }


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/102554.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 不见青山存完结(霍青秦兮霍宴)_不见青山存完结霍青秦兮霍宴
  • 他的干妹妹怀孕后,我闪婚了文集(林诺陆深)全书免费_(林诺陆深)他的干妹妹怀孕后,我闪婚了文集后续(林诺陆深)
  • 江先生,你要听话列表列表_江先生,你要听话列表(许清欢江砚舟)
  • 一抹斜阳相思泪后续+必读夏知微陆远川完本_一抹斜阳相思泪后续+必读(夏知微陆远川)
  • 「不当假少爷后,我娶了首富当老婆」免费试读_萧寒沈凌薇章节多结局预体验‌
  • 全书浏览我死后,数万网友对我进行审判火爆(董天华尹瑶)_我死后,数万网友对我进行审判火爆(董天华尹瑶)全书结局
  • 纨绔恶少抽盲盒选妻子,我换嫁绝嗣总裁后他发疯求原谅+免费+后续列表_纨绔恶少抽盲盒选妻子,我换嫁绝嗣总裁后他发疯求原谅+免费+后续(阮玉绵)
  • 完结文晚云为落日溺亡++后续列表_完结文晚云为落日溺亡++后续(裴念舒)
  • [修仙:我在云疆养仙蚕]章节多结局预体验‌_「林珂」小说无删减版在线阅读
  • 全书浏览我死后,数万网友对我进行审判++番外(董天华尹瑶)_我死后,数万网友对我进行审判++番外(董天华尹瑶)全书结局
  • 被兄弟俩接连当工具人后,我杀疯了后续+(贺云舟)全书免费_(贺云舟)被兄弟俩接连当工具人后,我杀疯了后续+后续(贺云舟)
  • [发现装穷老公的真面目后,我迎来美好人生]反转剧情碎片化试读_傅思瀚方知晓晓晓完结

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1