嵌入式LAB 8:网络LED矩阵显示器

前期工作准备:

Mac OS X + Ubuntu14.04虚拟机

器材准备:

树莓派
MAX7219驱动的8x8 LED矩阵
外接显示屏
不需要面包板

实验步骤:

1、编写客户端代码

这里写图片描述
经典的socket套接字编程,没什么可说的

#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <fstream>

using namespace std;

#define SERVER_PORT 6666 
#define BUFFER_SIZE 1000

FILE *MAX7219;


void* ClientThread(void *lpParameter) {

    struct sockaddr addr;
    struct sockaddr_in *addr_v4;

    int clientfd = *(int*) lpParameter;

    char buffer[BUFFER_SIZE + 1];
    string recv_str;

    while (1) {
        if (recv(clientfd, buffer, BUFFER_SIZE, 0) == -1) {
            cout << "recv failed" << endl;
            break;
        }

        istringstream in(buffer);
        in >> recv_str;

        fprintf(MAX7219, "%s\n", recv_str.c_str());
        fflush(MAX7219);
    }

    close(clientfd);
    return 0;
}

int main(int argc, const char * argv[]) {

    if ((MAX7219 = fopen("/dev/MAX7219", "w")) == NULL) {
        cout << "MAX7219 open error!" << endl;
        return 0;
    }
    fprintf(MAX7219, "1234\n");
    fflush(MAX7219);

    socket serverfd, clientfd; 
    struct sockaddr_in saddr, caddr;

    serverfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverfd == -1) {
        cout << "socket() failed!" << endl;
        return 0;
    }

    memset(&saddr, 0, sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(SERVER_PORT);
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);

    //bind
    bind(serverfd, (struct sockaddr *) &saddr, sizeof(saddr));

    //listen
    int ret = listen(serverfd, 5);
    if (ret == -1) {
        cout << "listen failed!" << endl;
        close(serverfd);
        return 0;
    }

    cout << "Waiting for client connecting!" << endl;
    cout << "tips : Ctrl+c to quit!" << endl;

    while (true) {
        //accpet
        socklen_t length = sizeof(caddr);

        clientfd = accept(serverfd, (struct sockaddr *) &caddr, &length);

        cout << "new client" << endl;

        if (clientfd == -1) {
            cout << "accept() failed!" << endl;
            continue;
        }

        cout << "Accepted client: " << inet_ntoa(caddr.sin_addr) << ":" << ntohs(caddr.sin_port) << endl;

        pthread_t hThread;
        pthread_create(&hThread, NULL, ClientThread, &clientfd);

        if (hThread < 0) {
            printf("Create Thread Failed!\n");
            break;
        }

        char title[] = "welcome server\r\n";
        send(clientfd, title, strlen(title), 0);
    }

    close(serverfd);
}

这里写图片描述

2、编写客户端的代码

老师说用telnet,不过客户端可以在本地编写了。还是写Java比较方便,不用做复杂的socket、bind、listen、accept什么的。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值