1. 程式人生 > >基於Glib的網路實現示例

基於Glib的網路實現示例

Glib簡介

Glib庫是C語言的好夥伴,整體設計的非常好!
但是,Glib的例子非常少. 不容易學習和借鑑.
這裡的例子就是採用glib的高層網路API實現的TCP服務端和客戶端.

以下例項都是正常執行的程式碼

TCP服務端程式碼例項:

#include <glib.h>
#include <gio/gio.h>

gchar *buffer;

gboolean
network_read(GIOChannel *source,
            GIOCondition cond,
            gpointer data)
{
  GString *s
= g_string_new(NULL); //error should be inited with NULL GError *error=NULL; GIOStatus ret = g_io_channel_read_line_string(source, s, NULL, &error); if (ret == G_IO_STATUS_ERROR){ g_error ("Error reading: %s\n", error->message); g_object_unref(data); return FALSE; } else
if (ret == G_IO_STATUS_EOF){ g_print("finished\n"); return FALSE; }else{ g_print("Got: %s\n", s->str); //you should return this return TRUE; } } gboolean new_connection(GSocketService *service, GSocketConnection *connection, GObject *source_object
, gpointer user_data) { // tell glib not to disconnect g_object_ref(connection); GSocketAddress *sockaddr = g_socket_connection_get_remote_address(connection, NULL); GInetAddress *addr = g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(sockaddr)); guint16 port = g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(sockaddr)); g_print("New Connection from %s:%d\n", g_inet_address_to_string(addr), port); GSocket *socket = g_socket_connection_get_socket(connection); gint fd = g_socket_get_fd(socket); GIOChannel *channel = g_io_channel_unix_new(fd); //g_io_add_watch(channel, G_IO_IN, (GIOFunc) network_read, NULL); g_io_add_watch(channel, G_IO_IN, (GIOFunc) network_read, connection); return TRUE; } int main(int argc, char **argv) { GSocketService *service = g_socket_service_new(); GInetAddress *address = g_inet_address_new_from_string("127.0.0.1"); GSocketAddress *socket_address = g_inet_socket_address_new(address, 4000); g_socket_listener_add_address(G_SOCKET_LISTENER(service), socket_address, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, NULL, NULL, NULL); g_object_unref(socket_address); g_object_unref(address); g_socket_service_start(service); g_signal_connect(service, "incoming", G_CALLBACK(new_connection), NULL); GMainLoop *loop = g_main_loop_new(NULL, FALSE); g_main_loop_run(loop); }

TCP客戶端程式碼例項:

#include <glib.h>
#include <gio/gio.h>
#include <stdio.h>
#include <string.h>

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

    GError *error = NULL;

    GSocketClient * client = g_socket_client_new();

    //GSocketConnection * connection = g_socket_client_connect_to_host (client,"10.9.27.15",5000,NULL,&error);
    GSocketConnection * connection = g_socket_client_connect_to_host (client,"localhost",9100,NULL,&error);


    if (error){
        g_error(error->message);
    }else{
        g_message("Connection ok");
    }

    guint8 buffer[]={170, 255, 255, 1, 204, 125, 128};
    guint8 incoming_buff[100]={0};

    GInputStream * in_stream = g_io_stream_get_input_stream(G_IO_STREAM(connection));
    GOutputStream * out_stream = g_io_stream_get_output_stream(G_IO_STREAM(connection));
    g_output_stream_write(out_stream, buffer, 7, NULL, &error);
    int incoming_num = g_input_stream_read(in_stream,incoming_buff,100,NULL,&error);

    if(error)
        g_error(error->message);
    else{
        int i=0; 
        printf("incoming:\n");
        for(;i<incoming_num;i++)
            printf("%hhX ",incoming_buff[i]);
        printf("\n");

        //g_message(incoming_buff);
    }

    return TRUE;

}

相關推薦

基於Glib網路實現示例

Glib簡介 Glib庫是C語言的好夥伴,整體設計的非常好! 但是,Glib的例子非常少. 不容易學習和借鑑. 這裡的例子就是採用glib的高層網路API實現的TCP服務端和客戶端. 以下例項都是正常執行的程式碼 TCP服務端程式碼例項: #

用TensorFlow基於神經網路實現井字棋(含程式碼)

為了展示如何應用神經網路演算法模型,我們將使用神經網路來學習優化井字棋(Tic Tac Toe)。明確井字棋是一種決策性遊戲,並且走棋步驟優化是確定的。 開始 為了訓練神經網路模型,我們有一系列優化的不同的走棋棋譜,棋譜基於棋盤位置列表和對應的最佳落子點。考慮到棋盤的對稱性,通

ufldl 深度學習入門 第一發:基於BP網路實現稀疏自編碼器

目的:打算使用深度學習的方式實現人臉關鍵點的檢測,第一步是要學習深度學習。 步驟:第一步在ufldl上面學習深度學習的演算法基礎知識,然後找部落格上基於python呼叫theano庫實現人臉關鍵點檢測的演算法,看懂後基於C++實現,然後用java實現app,呼叫C++實現的

python基於神經網路實現人臉識別

一.專案簡介 1.資料 需要資料QQ聯絡:1209028652 資料集:總共資料集由兩部分組成:他人臉圖片集及我自己的部分圖片 自己圖片目錄:face_recog/my_faces 他人圖片目錄:face_recog/other_faces 我的測試圖片目錄:face_r

BP神經網路基於Tensorflow的實現(程式碼註釋詳細)

BP(back propagation)神經網路是1986年由Rumelhart和McClelland為首的科學家提出的概念,是一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用最廣泛的神經網路。 在一般的BP神經網路中,單個樣本有m個輸入和n個輸出,在輸入層

基於HttpClient4.5實現網路爬蟲

個人部落格站已經上線了,網址 www.llwjy.com ~歡迎各位吐槽~-------------------------------------------------------------------------------------------------   

基於粒子群演算法的概率神經網路實現多分類(PSO_PNN)

基於粒子群演算法的概率神經網路實現多分類:用粒子群演算法(PSO)實現概率神經網路中(PNN)的引數spread的最優化,並用PNN實現訓練並測試多類別資料,多分類效果很棒,有需要請聯絡[email protected],需要一定費用。

基於卷積神經網路實現圖片風格的遷移 3

實現圖片的風格轉換 一、實驗介紹 1.1 實驗內容 上一節課我們介紹了經典的CNN模型 VGG ,以及影象風格遷移演算法的基本原理。本節課我們將使用另外一個經典的模型 GoogLenet 來實現我們的專案(這是由於環境的限制,用 googlenet可以更快的完成我們的風格轉換),如果你完成了上節課的作業,那

深度學習之卷積神經網路CNN及tensorflow程式碼實現示例詳細介紹

一、CNN的引入 在人工的全連線神經網路中,每相鄰兩層之間的每個神經元之間都是有邊相連的。當輸入層的特徵維度變得很高時,這時全連線網路需要訓練的引數就會增大很多,計算速度就會變得很慢,例如一張黑白的 28×28 的手寫數字圖片,輸入層的神經元就有784個,如下圖所示:

深度學習之卷積神經網路CNN及tensorflow程式碼實現示例

一、CNN的引入 在人工的全連線神經網路中,每相鄰兩層之間的每個神經元之間都是有邊相連的。當輸入層的特徵維度變得很高時,這時全連線網路需要訓練的引數就會增大很多,計算速度就會變得很慢,例如一張黑白的 28×28 的手寫數字圖片,輸入層的神經元就有784個,如下圖

基於神經網路的目標檢測論文之目標檢測系統:實時路況檢測系統的設計與實現

注:本文源自本人的碩士畢業論文,未經許可,嚴禁轉載! 原文請參考知網:知網地址 第五章 實時路況檢測系統的設計與實現 物體識別技術被廣泛應用於人們的生產生活中。隨著深度學習與雲端計算的飛速發展,帶動了物體識別技術產生質的飛躍。高解析度影象和檢測的實時性要求越來越

RxEasyHttp一款基於RxJava2+Retrofit2實現簡單易用的網路請求框架

RxEasyHttp 本庫是一款基於Retrofit2+RxJava2實現簡單易用的網路請求框架,結合android平臺特性的網路封裝庫,採用api鏈式呼叫一點到底,整合cookie管理,多種快取模式,極簡https配置,上傳下載進度顯示,請求錯誤自動重試

基於卷積神經網路實現圖片風格的遷移 2

VGG與風格遷移演算法原理 一、實驗介紹 1.1 實驗內容 上節課我們學習了卷積神經網路的基本原理,本節實驗我們將學習用於影象風格遷移的經典的卷積神經網路模型VGG,並用caffe提供的 draw_net.py 實現模型的視覺化,本節實驗我們也將學習影象風格轉換的演算法原理。 1.2 實驗知識點 經典CNN

基於卷積神經網路實現圖片風格的遷移 1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

基於PyTorch的LSTM長短時記憶網路實現MNIST手寫數字

本篇部落格主要介紹在PyTorch框架下,基於LSTM實現手寫數字的識別。在介紹LSTM長短時記憶網路之前,我先介紹一下RNN(recurrent neural network)迴圈神經網路.RNN是一種用來處理序列資料的神經網路,序列資料包括我們說話的語音、一段文字等等。它

機器學習實驗---人工神經網路MLP基於sklearn的實現

導語 上次寫了隨機森林的基於sklearn庫的大致實現步驟,這次我們來看看人工神經網路的實現步驟吧~ MLP就是多層感知器的意思,我們這裡也是通過引入MLPClassifier來實現的。 步驟詳解: 首先從sklearn中匯入MLPC 匯入待訓練的資料

基於CNN的驗證碼識別神經網路實現

一、前言 二、實戰 1、驗證碼生成 import random import numpy as np from PIL import Image from captcha.image import ImageCaptcha NUMBER = ['0', '1',

基於神經網路的2D攝像頭的手勢識別系統實現(一)

一、手勢識別的分類 若按照攝像頭的種類(2D攝像頭、深度攝像頭)來分,可分為兩類,1)基於2D攝像頭的二維手勢識別 和 2)基於3D攝像頭(如微軟的kinnect)三維手勢識別。早期的手勢識別識別是基於二維彩色影象的識別技術,所謂的二維彩色影象是指通過普通攝

吳恩達作業9:卷積神經網路實現手勢數字的識別(基於tensorflow)

提供資料集程式碼放在cnn_utils.py裡。 import math import numpy as np import h5py import matplotlib.pyplot as plt import tensorflow as tf from tensorfl

邊緣檢測︱基於 HED網路TensorFlow 和 OpenCV 實現圖片邊緣檢測

. 一、邊緣檢測 1、傳統邊緣檢測 Google 搜尋 opencv scan document,是可以找到好幾篇相關的教程的,這些教程裡面的技術手段,也都大同小異,關鍵步驟就是呼叫 OpenCV 裡面的兩個函式,cv2.Canny() 和 c