C++实现Linux中tcp网络通信

参考链接:https://zhuanlan.zhihu.com/p/360042334?utm_id=0
请添加图片描述
客户端代码:

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

#define SERVER_ADDRESS "127.0.0.1"
#define SERVER_PORT    3000
#define SEND_DATA      "hello world!"
#define recv_Buf_Size  32

int main(int argc,char *argv[])
{
        //创建一个socket
        int clientfd=socket(AF_INET,SOCK_STREAM,0);
        if(clientfd == -1)
        {
                std::cout<<"create client fd error. "<< std::endl;
                return -1;
        }

        //连接服务器
        struct sockaddr_in serveraddr;
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
        serveraddr.sin_port = htons(SERVER_PORT);
        if(connect(clientfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr))==-1)
        {
                std::cout << "connect socket error" << std::endl;
                return -1;
        }

        //向服务器端发送数据

        int ret = send(clientfd, SEND_DATA, strlen(SEND_DATA), 0);
        if(ret != strlen(SEND_DATA))
        {
                std::cout << "send data error." << std::endl;
                return -1;
        }

        std::cout << "send data successfully, data :" <<SEND_DATA << std::endl;


        //客户端收数据
        char recvBuf[recv_Buf_Size] = {0};
        ret = recv(clientfd, recvBuf, recv_Buf_Size, 0);
        if(ret >0)
        {
                std::cout << "recv data successfully, data: " << recvBuf <<std::endl;

        }
        else
        {
                std::cout << "recv data error, data: " << recvBuf <<std::endl;

        }
        //关闭socket
        close(clientfd);

        return 0;
}

服务端代码:

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

#define recvBuf_Size 32
#define SERVER_PORT 3000

int main(int argc,char *argv[])
{
        //创建一个监听socket
        int listenfd=socket(AF_INET,SOCK_STREAM,0);
        if(listenfd == -1)
        {

                std::cout<<"create client fd error. "<< std::endl;
                return -1;
        }

        //初始化服务器地址
        struct sockaddr_in bindaddr;
        bindaddr.sin_family = AF_INET;
        bindaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        bindaddr.sin_port = htons(SERVER_PORT);
        if(bind(listenfd,(struct sockaddr *)&bindaddr,sizeof(bindaddr)) == -1)
        {


                std::cout << "bind listen  socket error" << std::endl;
                return -1;
        }

        //启动监听

        if(listen(listenfd,SOMAXCONN) == -1)//SOMAXCONN 表示监听队列数默认为128
        {

                std::cout << "listen error." << std::endl;
                return -1;
        }
        //记录所有客户端连接的容器
        std::vector<int> clientfds;

        while(true)
        {
                struct sockaddr_in clientaddr;
                socklen_t clientaddrlen = sizeof(clientaddr); //accept函数第三个参数需要的类型

                //接受客户端的连接
                int clientfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clientaddrlen );
                if(clientfd != -1 )
                {
                        char recvBuf[recvBuf_Size] ={0};
                        //从客户端接受数据
                        int ret = recv(clientfd, recvBuf, recvBuf_Size, 0);
                        if(ret > 0)
                        {
                                std::cout <<"recv data from client, data:" <<recvBuf <<std::endl;
                                //将收到的数据处理后发送给客户端
                                ret = send(clientfd, recvBuf, strlen(recvBuf), 0);
                                if(ret != strlen(recvBuf))
                                        std::cout << "send data error."<< std::endl;

                                std::cout << "send data successfully,data:" << recvBuf << std::endl;

                        }
                        else

                        {
                                std::cout <<"recv data error." <<std::endl;
                        }
                        //关闭客户端fd
                        close(clientfd);

                }
        }


        //关闭监听fd
        close(listenfd);
        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值