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)
关闭流,释放相关资源