嵌入式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:
在這裏插入圖片描述
在這裏插入圖片描述

微信公衆號

歡迎掃描關注我的微信公衆號, 及時獲取最新文章:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章