Socket 学习 2

Socket通信学习(自用笔记)

二、linux下的socket通信实践(ubuntu18.04)

1.实现和windows下的socket例程类似的功能,比较两者的区别

2.参考资料:https://guisu.blog.csdn.net/article/details/7445768 

                          https://blog.csdn.net/feixiaoxing/article/details/8567162

                          https://blog.csdn.net/liyuefeilong/article/details/47265153

3.实现效果

        

4.代码

server.cpp

#include<netinet/in.h>
#include<sys/socket.h> //linux系统中关于socket的头文件
// 类似于windows下的“windows.h”,提供统一的API接口(read,write等)
#include<unistd.h>  
#include<string.h>
#include<iostream>
#include<arpa/inet.h> //转换点分十进制函数inet_ptoa()

using  namespace std;

#define PORT 8000

int main(int argc,char **argv)
{
    cout <<"Socket服务端"<<endl;

    //创建  Socket
    int serversocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    sockaddr_in server_addr;
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(PORT);
    server_addr.sin_addr.s_addr=INADDR_ANY;

    //绑定套接字
    bind(serversocket,(sockaddr*)&server_addr,sizeof(server_addr));

    //建立通信套接字标识符
    int clientsocket;
    sockaddr_in client_addr;
    socklen_t len=sizeof(client_addr);
    
    //接受缓冲区
    char buffer[100];

    //建立通信
    while (true)
    {
        if (listen(serversocket,5))
        {
            cout<<"连接失败"<<endl;
            break;
        }

        clientsocket=accept(serversocket,
        (sockaddr*)&client_addr,&len);

        if (clientsocket<0)
        {
            cout<<"连接失败"<<endl;
        }
        else
        {
            cout<<"连接到:"<<inet_ntoa(client_addr.sin_addr)
            <<endl;
        
        }

        //进入接受消息循环
        int num=recv(clientsocket,buffer,100,0);
        if (num>0)
        {
            buffer[num]='\0';
            cout<<"客户端说:"<<buffer<<endl;
        }

    }

    close(clientsocket);
    close(serversocket);
    return 0;
}

client.cpp

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

using namespace std;

#define port 8000
#define ip "192.168.1.104"

int main(int argc,char**argv)
{
    cout <<"Socket客户端"<<endl;

    //创建套接字
    int clientsocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    sockaddr_in client_addr;
    client_addr.sin_family=AF_INET;
    client_addr.sin_port=htons(port);
    client_addr.sin_addr.s_addr=inet_addr(ip);

    int check=connect(clientsocket,(sockaddr*)&client_addr,sizeof(client_addr));
    if(check<0)
    {
        cout<<"连接失败"<<endl;
        cout<<"请先开启服务器"<<endl;
        system("pause");
        return(1);
    }
    else
    {
        cout<<"连接成功"<<endl;
    }

    //循环发送
    while(true)
    {
        string text;
        const char* msg;
        cout <<"请输入:";
        cin>>text;
        // msg=text.c_str();

        send(clientsocket,(char*)text.c_str(),text.length(),0);

    }
    close(clientsocket);
    return (0);
}

5.编译

VScode写完后,直接利用ubuntu的g++编译器进行编译

6.问题汇总

(1).在IDE中写的代码,记得保存后才能正常编译

(2).在参考的例子中还看见了一些优化的函数:bzero();memset();setsockopt()等;涉及到一些其他的操作,以后有机会在深入

 

7.接下来,尝试夸系统之间的通信,并且结合turtlebot实验需要,在更改函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值