Lab8 : 網(wǎng)絡(luò)LED矩陣顯示器 - 嵌入式與計算機網(wǎng)絡(luò)

前言

本次實驗延續(xù)上次實驗的環(huán)境,使用MAX7219驅(qū)動8x8點陣沈善。上位機使用Ubuntu 14.04,下位機使用Raspberry pi 2。

使用的還是上次實驗編譯好的非阻塞式寫入點陣支持內(nèi)核模塊江锨。

這次的實驗跟計網(wǎng)實驗好像啊好像啊。

控制點陣顯示字符

通過write函數(shù)向device寫入數(shù)據(jù)即可糕篇。

#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int Matrix;

#define ALLCHAR "0123456789abcdefghijklmnopqrstuvwxyz"

int main(){
    Matrix = open("/dev/matrix", O_WRONLY);
    if (Matrix < 0){
        fprintf(stderr, "Cound not open matrix device");
        exit(1);
    }
    write(Matrix, ALLCHAR, strlen(ALLCHAR));
    return 0;
}

編寫網(wǎng)絡(luò)程序接受TCP請求

使用linux下的socket編程啄育,接受外部TCP請求,并將其發(fā)送來的所有數(shù)據(jù)寫入matrix設(shè)備即可實現(xiàn)顯示功能拌消。

Socket流程圖 | 圖自[Linux的SOCKET編程詳解](http://blog.csdn.net/hguisu/article/details/7445768)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int Matrix;
int server;

#define PORT 8080
#define ADDR "0.0.0.0"
#define QUEUE 20

#define BUFF_SIZE 2048

int main(){
    // 打開matrix
    Matrix = open("/dev/matrix", O_WRONLY);
    if (Matrix < 0){
        fprintf(stderr, "Cound not open matrix device\n");
        exit(1);
    }
    // 建立服務(wù)器
    int server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr(ADDR);
    serverAddr.sin_port = htons(PORT);

    // 綁定ip以及端口
    if (bind(server, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1){
        fprintf(stderr, "Count not bind %s:%d\n", ADDR, PORT);
        exit(1);
    }

    if (listen(server, QUEUE) == -1){
        fprintf(stderr, "Listen error\n");
        exit(1);
    }

    printf("Server running at %s:%d\n", ADDR, PORT);

    while (1){
        struct sockaddr_in clientAddr;
        socklen_t length = sizeof(clientAddr);

        // 對連入的連接進行處理
        int conn = accept(server, (struct sockaddr*)&clientAddr, &length);
        if (conn < 0){
            fprintf(stderr, "Connect error");
            exit(1);
        }

        printf("A new connection from %s:%d\n", inet_ntoa(clientAddr.sin_addr), clientAddr.sin_port);

        // 處理連接發(fā)送過來的字符
        while (1){
            char receiveBuf[BUFF_SIZE];
            int count;
            memset(receiveBuf, 0, sizeof(receiveBuf));
            
            // 接收字符
            count = recv(conn, receiveBuf, sizeof(receiveBuf), 0);

            // 如果接收到的字符為空挑豌,則表示離開
            if (count == 0){
                close(conn);
                break;
            }
            
            // 將接收到的所有字符發(fā)送給matrix進行顯示
            write(Matrix, receiveBuf, count);
        }
    }
    close(server);
    return 0;
}
樹莓派本地連入
上位機遠程連入

使用線程處理多個連接

上一節(jié)的程序使用的是阻塞式的處理連接,這將導(dǎo)致服務(wù)器每次accept了一個連接之后墩崩,無法再處理其余連接氓英。

而這種情況的處理方式有很多○谐铮可以使用一個線程對應(yīng)一個socket fd的方式進行阻塞式監(jiān)聽铝阐。也可以使用IO多路復(fù)用,如select铐拐、poll徘键、epoll练对,在單線程的環(huán)境下進行高效的網(wǎng)絡(luò)IO操作。

使用線程的方式對于阻塞式程序的改動較小吹害,基本上邏輯還是一致的螟凭。

…………
void* serverRecv(void* data){
    int conn = *(int*)data;

    while (1){
        char receiveBuf[BUFF_SIZE];
        int count;
        memset(receiveBuf, 0, sizeof(receiveBuf));
        
        count = recv(conn, receiveBuf, sizeof(receiveBuf), 0);

        if (count == 0){
            close(conn);
            break;
        }
        
        write(Matrix, receiveBuf, count);
    }

    pthread_exit(NULL);
    return NULL;
}
…………
int main(){
…………
    printf("Server running at %s:%d\n", ADDR, PORT);

    while (1){
        pthread_t thread;
        struct sockaddr_in clientAddr;
        socklen_t length = sizeof(clientAddr);
        int conn = accept(server, (struct sockaddr*)&clientAddr, &length);
        int result;
        if (conn < 0){
            fprintf(stderr, "Connect error");
            exit(1);
        }

        printf("A new connection from %s:%d\n", inet_ntoa(clientAddr.sin_addr), clientAddr.sin_port);

        result = pthread_create(&thread, NULL, serverRecv, &conn);
        if (result < 0){
            printf("Create thread error\n");
            exit(1);
        }
    }
…………
}

在這個版本中,主程序只負責(zé)接受連接赠制,而接受到的連接交由子線程進行監(jiān)聽處理赂摆。

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钟些,一起剝皮案震驚了整個濱河市烟号,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌政恍,老刑警劉巖汪拥,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異篙耗,居然都是意外死亡迫筑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門宗弯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脯燃,“玉大人,你說我怎么就攤上這事蒙保≡铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵邓厕,是天一觀的道長逝嚎。 經(jīng)常有香客問我,道長详恼,這世上最難降的妖魔是什么补君? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮昧互,結(jié)果婚禮上挽铁,老公的妹妹穿的比我還像新娘。我一直安慰自己敞掘,他們只是感情好叽掘,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渐逃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪民褂。 梳的紋絲不亂的頭發(fā)上茄菊,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天疯潭,我揣著相機與錄音,去河邊找鬼面殖。 笑死竖哩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的脊僚。 我是一名探鬼主播相叁,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辽幌!你這毒婦竟也來了增淹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤乌企,失蹤者是張志新(化名)和其女友劉穎虑润,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體加酵,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡拳喻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猪腕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冗澈。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陋葡,靈堂內(nèi)的尸體忽然破棺而出亚亲,到底是詐尸還是另有隱情,我是刑警寧澤脖岛,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布朵栖,位于F島的核電站,受9級特大地震影響柴梆,放射性物質(zhì)發(fā)生泄漏陨溅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一绍在、第九天 我趴在偏房一處隱蔽的房頂上張望门扇。 院中可真熱鬧,春花似錦偿渡、人聲如沸臼寄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吉拳。三九已至,卻和暖如春适揉,著一層夾襖步出監(jiān)牢的瞬間留攒,已是汗流浹背煤惩。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炼邀,地道東北人魄揉。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像拭宁,于是被迫代替她去往敵國和親洛退。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在杰标,面了一些公司兵怯,掛了不少,但最終還是拿到小米在旱、百度摇零、阿里、京東桶蝎、新浪驻仅、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,253評論 11 349
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • 蘇州創(chuàng)客邦出租寫字樓 租金面議登渣。 家文化的創(chuàng)客邦噪服,在高新區(qū)給你一個創(chuàng)業(yè)的家,共享創(chuàng)客邦的全國資源庫并獨有高新區(qū)的資...
    大樹樹2017閱讀 170評論 0 0
  • scroll家族 Offset 自己的 偏移scroll 滾動的 1/ scrollTop 和 s...
    越IT閱讀 1,280評論 0 1
  • 白芷/文 盡管工作很忙碌胜茧,時間很匆忙粘优。小妹還是花了四天時間往返深圳和海南,在展開一條愛情長跑線的同時呻顽,順便帶著爸媽...
    白芷茶舍閱讀 669評論 0 0