glib库 socket通信相关的几个函数和数据结构 (二) 打开连接 发送 接收和关闭连接

来源:互联网 发布:赵薇事件始末 知乎截图 编辑:程序博客网 时间:2024/06/01 09:52

1.网络通信时几个阶段都需要三种数据:

    GSocketConnection *conn;        // 用于数据服务
    GInputStream     *input;        // 用于接收消息
    GOutputStream      *output;        // 用于发送消息

2.打开连接

    首先创建一个用于监听和接收连接的辅助对像

    GSocketClient *client = g_socket_client_new ()

    成功返回一个GSocketClient对象,失败返回NULL


    io超时设置

    g_socket_client_set_timeout (client, n)

    client就是前面创建的对象,n是一个无符整型,如果连接超时n秒(guint)则再次尝试。

    这个函数在老的版本(至少在2.22.2)中没有,我是在2.25里找到的


    打开连接

    conn = g_socket_client_connect_to_host (client,
                          host,
                          port,
                          NULL, &error)

    host是字符串类型的ip地址,port是guint类型的端口号,第四个参数是GCancellable类型,在这里设为NULL,第五个参数是error是GError **类的对象指针。

    连接成功时创建和返回一个GSocketConnection对象,失败返回NULL,并将错误码写入**error变量。

    成功打开连接后就可以释放client对象了。


    将连接与I/O关联

    output = g_io_stream_get_output_stream (G_IO_STREAM (conn));
    input = g_io_stream_get_input_stream (G_IO_STREAM (conn));


    设置关闭方式
    g_tcp_connection_set_graceful_disconnect (G_TCP_CONNECTION (*conn), TRUE)

    G_TCP_CONNECTION在老的版本中也写成GTcpConnection;TRUE表示设置成graceful disconnect ,graceful disconnect意味着在关闭连接前数据已经全部

    发送到对方,或发生异常。同时因为要接收对方的数据接收成功确认信息,所以需要花费一定的时间。


3.发送信息

    g_output_stream_write_all (output, buffer, count, bytes_written, NULL, error)

    output是第一步时定义的io输出流指针;buffer是指向发送数据的数据区指针;count(gsize类型)是要写入output流的数据的字节数,即要发送的数据字节数;

    bytes_written(gsize类型)记录成功写入的字节数,不需要记录则设为NULL;第六个参数是GCancellable类型的指针,可为NULL;error是GError **类的对象指针。

    该函数成功返回TRUE,失败返回FALSE。

    可能返回的错误码:

    G_IO_ERROR_TIMED_OUT == (*error)->code,发送超时

   

4.接收信息

   gssize g_input_stream_read (input, buffer, count, NULL, error)

    input是第一步时定义的io输入流指针;buffer是指向接收数据的数据区指针,数据区的大小必须大于等于第二个参数; count指定需要读取的字节数;第二个参数

    是GCancellable类型的指针,如果不为空,接收数据操作可能被其他线程的cancellable对象取消;error是GError **类的对象指针。

    接收成功则返回接收成功的字节数,如果count为0,返回0,函数什么也不会做;

    失败返回-1,失败原因则有几种可能((*error)->code):

    G_IO_ERROR_CANCELLED ,操作被取消

    G_IO_ERROR_INVALID_ARGUMENT,参数错误,例如count大于G_MAXSSIZE(long的最大值)


5.关闭连接

    g_io_stream_close (G_IO_STREAM (conn), NULL, &error)

    关闭流,释放相关资源



   


   


原创粉丝点击