嵌入式Linux network

前言

这是前篇:

本篇介绍下网络的使用, 采用米尔MYS-6ULX板子出厂配置的系统. 主要参考 Linux 网络编程——TCP编程, 很浅显易懂, 还有野火的11. 套接字, 这一篇也可以看看: Linux网络编程.

PC, Ubuntu18, IP地址192.168.3.141, 作为服务器(server).
i.MX6ULL, 和服务器在同一局域网, 作为客户端(client).

网络通信简介

核心步骤和流程:
在这里插入图片描述

服务器程序

来自米尔官方带的例程, 编写pc_server.c:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>

#define SERVPORT 3333 /*port */
#define BACKLOG 10    /* max client */

int main()
{
    int sockfd, client_fd;
    struct sockaddr_in my_addr; /* loacl */
    struct sockaddr_in remote_addr;
    int sin_size;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket fail!");
        exit(1);
    }
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(SERVPORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero), 8);

    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
    {
        perror("bind error!");
        exit(1);
    }
    if (listen(sockfd, BACKLOG) == -1)
    {
        perror("listen error!");
        exit(1);
    }
    while (1)
    {
        sin_size = sizeof(struct sockaddr_in);
        if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
        {
            perror("accept error");
            continue;
        }
        printf("REC FROM: %s\n", inet_ntoa(remote_addr.sin_addr));

        if (fork() == 0)
        {
            if (send(client_fd, "Make Your idea Real! \n", 26, 0) == -1)
                perror("send error!");
            close(client_fd);
            exit(0);
        }
        else
            close(client_fd);
    }
}

使用gcc编译: gcc -o server pc_server.c

客户端程序

编写arm_client.c :

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define SERVPORT 3333
#define MAXDATASIZE 100 /*max client */
#define SERVER_IP "192.168.3.141"

int main(int argc, char *argv[])
{
    int sockfd, recvbytes;
    char buf[MAXDATASIZE];
    struct hostent *host;
    struct sockaddr_in serv_addr;

    if ((host = gethostbyname(SERVER_IP)) == NULL)
    {
        herror("gethostbyname error!");
        exit(1);
    }
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket create error!");
        exit(1);
    }
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(SERVPORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero), 8);
    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
    {
        perror("connect error!");
        exit(1);
    }
    if ((recvbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
    {
        perror("connect error!");
        exit(1);
    }
    buf[recvbytes] = '\0';
    printf("form server: %s", buf);
    close(sockfd);
}

交叉编译: arm-linux-gnueabihf-gcc -o arm_client arm_client.c

运行

PC运行./server, 开发板运行./arm_client:
在这里插入图片描述
在这里插入图片描述

微信公众号

欢迎扫描关注我的微信公众号, 及时获取最新文章:
在这里插入图片描述

发布了203 篇原创文章 · 获赞 105 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/weifengdq/article/details/104968031