如何在linux/ubuntu下编写c++网络通信代码

2025-11-08 06:59:48

1、1.服务器端的代码:

void SocketServer::CreateConnect(){    std::cout<<"start Create Socket!"<<std::endl;    m_nSocket = -1;    struct sockaddr_in server_addr;    struct sockaddr_in client_addr;    int portnumber=4321;    if((m_nSocket=socket(AF_INET,SOCK_STREAM,0))==-1)    {        std::cout<<"socket Create Failed!"<<strerror(errno)<<std::endl;        return;    }    std::cout<<"Create Socket Finish!"<<std::endl;     /* 服务器端填充 sockaddr结构  */    bzero(&server_addr,sizeof(struct sockaddr_in));    server_addr.sin_family=AF_INET;    server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");    server_addr.sin_port=htons(portnumber);    /* 捆绑sockfd描述符  */    if(bind(m_nSocket,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)    {        std::cout<<"Server Bind Failed!"<<strerror(errno)<<std::endl;        return;    }    std::cout<<"bind Socket Finish!"<<std::endl;    /* 监听sockfd描述符  */    if(listen(m_nSocket,5)==-1)    {        std::cout<<"Listen Failed!"<<strerror(errno)<<std::endl;        return;    }    std::cout<<"listen Socket Finish!"<<std::endl;    while(1)    {        /* 服务器阻塞,直到客户程序建立连接  */        std::cout<<"listen start..."<<std::endl;        int nNewFd=-1;        size_t nSize = sizeof(struct sockaddr_in);        if((nNewFd=accept(m_nSocket,(struct sockaddr *)(&client_addr),&(nSize))) == -1)        {            std::cout<<"accept Failed!"<<strerror(errno)<<std::endl;            return;        }        std::cout<<"server Get Connect from:"<<inet_ntoa(client_addr.sin_addr)<<std::endl;        while(1)        {            char buf[256] = "0";            size_t  len = recv( nNewFd, buf, 256, 0) ;            if ( len > 0)                std::cout<<"接受的消息为:"<<buf<<std::endl;            else {                if ( len < 0)                    std::cout<<"错误为:"<<strerror( errno)<<std::endl;                else                    std::cout<<"客户端断开:"<<std::endl;                break;            }        }        /* 这个通讯已经结束     */        //close(nNewFd);        /* 循环下一个     */    }}

2、2.客户端代码:

//创建链接void SocketClient::CreateConnect(){    char buffer[1024];    struct sockaddr_in server_addr;    std::cout<<"socket create start!"<<std::endl;    /* 客户程序开始建立 sockfd描述符  */    if((m_nSocket=socket(AF_INET,SOCK_STREAM,0))==-1)    {        std::cout<<"Client socket Create Failed!!"<<strerror(errno)<<std::endl;        return;    }    std::cout<<"socket create finshed!"<<std::endl;    /* 客户程序填充服务端的资料       */    int portnumber = 4321;    bzero(&server_addr,sizeof(server_addr));    server_addr.sin_family=AF_INET;    server_addr.sin_port=htons(portnumber);    server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");    /* 客户程序发起连接请求         */    if(connect(m_nSocket,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)    {        std::cout<<"Client connect Fialed!"<<strerror(errno)<<std::endl;        return;    }    std::cout<<"connect finshed!"<<std::endl;    std::string str="start...";    while(!str.empty())    {        std::cout<<"starting....!"<<std::endl;        std::cin>>str;        size_t len = send ( m_nSocket, str.c_str(), str.length(), 0) ;        if ( len < 0)        {            std::cout<<"消息发送失败"<<str<<strerror (errno)<<std::endl;        }        else        {            std::cout<<"消息发送成功"<<str<<std::endl;        }    }

close(m_nSocket);}

3、3.编译完成后,启动服务器端代码和客户端代码就可以进行通信了。

如何在linux/ubuntu下编写c++网络通信代码

如何在linux/ubuntu下编写c++网络通信代码

4、4.普及一下TCP/IP协议的部分知识,大家都知道TCP是面向链接的协议,即在进行通信前服务器是被动链接,客户端是主动链接,那么客户端与服务器端的连接需要经过三次握手才能建立链接。在整个通信过程中客户端与服务器端的进行的通信都有确认机制,保证包能顺利的到达对方,但这也不是100%,中间的路由等中间桥出现问题,也有可能造成数据包的丢失,而任何一方没有收到确认包,都会一直处于等待和重传的过程中...

服务器:

创建socket->bind->listen->recv(send)->close

客户端:

创建socket->connect->recv(send)->close

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢