网络编程day2

这篇具有很好参考价值的文章主要介绍了网络编程day2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

网络编程day2,嵌入式学习-网络编程,网络

TCP的基本通信

服务器端

#include <head.h>
#define SER_PORT 8888                  //服务器端口号
#define SER_IP  "192.168.125.211"      //服务器客户端

int main(int argc, const char *argv[])
{
    //1、创建用于连接的套接字
    int sfd = socket(AF_INET, SOCK_STREAM, 0);  
    //参数1:通信域,表明使用的是ipv4协议
    //参数2:通信方式,使用TCP通信
    //参数3:0表示之前已经指定协议 IPPROTO_TCP
    
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("sfd = %d\n", sfd);               //3


    //将端口号快速重用函数
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("端口号快速重用成功\n");

    //2、给当前套接字绑定IP地址和端口号
    //2.1填充要绑定的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family =     AF_INET;        //通信域
    sin.sin_port =         htons(SER_PORT);  //端口号
    sin.sin_addr.s_addr =     inet_addr(SER_IP);    //ip地址

    //2.2 绑定
    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success %s %s %d\n", __FILE__, __func__, __LINE__);

    //3、将套接字设置成监听状态
    if(listen(sfd, 128) == -1)
    {
        perror("listen error");
        return -1;
    }
    printf("listen success %s %s %d\n", __FILE__, __func__, __LINE__);

    //4、阻塞等待客户端的链接请求
    //4.1定义容器接收客户端的地址信息
    struct sockaddr_in cin;                  //用于接收地址信息
    socklen_t socklen = sizeof(cin);          //用于接收地址信息的大小

    int newfd = -1;
    //4.2 接收客户端的链接
    newfd = accept(sfd, (struct sockaddr*)&cin, &socklen);   
    if(newfd == -1)
    {
        perror("accept error");
        return -1;
    }
    printf("[%s:%d]发来链接请求 %s %s %d\n", \
           inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),__FILE__, __func__, __LINE__);

    //5、跟客户端进行消息通信
    char buf[128] = "";
    while(1)
    {
        //将数组清空
        bzero(buf, sizeof(buf));

        //读取客户端发来的消息
        //int res = read(newfd, buf, sizeof(buf));
        int res = recv(newfd, buf, sizeof(buf), 0);
        if(res == 0)
        {
            printf("客户端已经下线\n");
            break;
        }
        printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

        //给客户端发消息
        strcat(buf, "*_*");

        //write(newfd, buf, sizeof(buf));
        send(newfd, buf, sizeof(buf), 0);
        printf("发送成功\n");
    }

    //6、关闭套接字
    close(newfd);
    close(sfd);
    return 0;
}

客户端

#include <head.h>
#define SER_PORT  8888             //服务器端口号
#define SER_IP "192.168.125.211"    //服务器ip地址
#define CLI_PORT 6666                //客户端的端口号
#define CLI_IP "192.168.125.211"       //客户端ip地址

int main(int argc, const char *argv[])
{
    //1、创建用于通信的套接字文件描述符
    int cfd = -1;
    cfd = socket(AF_INET, SOCK_STREAM, 0);
    if(cfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("cfd = %d\n", cfd);            //3

    //2、绑定(可选)
    //2.1 填充地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(CLI_PORT);
    cin.sin_addr.s_addr = inet_addr(CLI_IP);
    //2.2绑定
    if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
    {
        perror("bind error");
        return  -1;
    }
    printf("bind  success\n");
    
    //3、连接服务器
    //3.1 填充服务器地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family =     AF_INET;
    sin.sin_port =         htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);
    //3.2 连接
    if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("connect success\n");
    
    //4、收发数据
    char buf[128] = "";
    while(1)
    {
        //清空数组
        bzero(buf, sizeof(buf));

        printf("请输入>>>");
        fgets(buf, sizeof(buf), stdin);   //从终端输入数据
        buf[strlen(buf)-1] = 0;          //将换行改为'\0'

        //发送给服务器
        send(cfd, buf, sizeof(buf), 0);
        printf("发送成功\n");
        if(strcmp(buf, "quit") == 0)
        {
            break;
        }

        //接收服务器发来的消息
        recv(cfd, buf, sizeof(buf), 0);
        printf("[%s:%d]:%s\n", SER_IP, SER_PORT, buf);
    }

    //5、关闭套接字
    close(cfd);

    return 0;
}

实现机械臂控制文章来源地址https://www.toymoban.com/news/detail-800234.html

#include <head.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    if(cfd == -1)
    {
        perror("socket eror");
        return -1;
    }

    //2、绑定(可选)
    
    //3、连接服务器
    //3.1 填充地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(8888);
    cin.sin_addr.s_addr = inet_addr("192.168.125.171");
    //3.2连接服务器
    if(connect(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
    {
        perror("connect error");
        return -1;
    }

    //4、向服务器发送消息
    char rbuf[5] = {0xff, 0x02, 0x00, 0xA6, 0xff};   //红色臂
    unsigned char bbuf[5] = {0xff, 0x02, 0x01, 0x00, 0xff};   //蓝色臂

    //先发送初始数据
    send(cfd, rbuf, sizeof(rbuf), 0);
    sleep(1);
    send(cfd, bbuf, sizeof(bbuf), 0);

    //通过键盘控制数据的收发
    char ch;
    while(1)
    {
        scanf("%c", &ch);
        getchar();

        //需要对输入的字符多分支选择
        switch(ch)
        {
        case 'W':
        case 'w':
            {
                rbuf[3] += 2;       //增加2度
                if(rbuf[3] >= 90)
                {
                    rbuf[3] = 90;
                }
                send(cfd, rbuf, sizeof(rbuf), 0);
            }
            break;

        case 'q':
            goto END;
        }

    }

END:
    //5、关闭套接字
    close(cfd);


    return 0;
}

到了这里,关于网络编程day2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包