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)
关闭流,释放相关资源
- glib库 socket通信相关的几个函数和数据结构 (二) 打开连接 发送 接收和关闭连接
- glib库 通信相关的几个函数和数据结构(-)GSocketConnection
- java socket连接以及发送和接收数据
- c++和java在socket通信过程中发送和接收函数的问题
- 笔记-Socket通信-基本操作(启动/连接/发送/关闭)
- HTTP和Socket通信的区别?Socket连接相关库,TCP,UDP的连接方法,Http的几种常用方式有哪些?
- MQTT连接服务器发送和接收数据
- MQTT连接服务器发送和接收数据
- socket发送和接收固定长度数据的函数
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- 关于DataAdapter打开和关闭连接
- TCP连接的同时打开和同时关闭
- muduo源码分析之实现TCP网络库(连接的接收和关闭)
- Java网络编程由浅入深二 Socket的构造和连接服务端的相关异常
- socket 发送信息和接收信息 多用于银行通信
- socket的发送和接收缓冲区
- 人生,也需要常回头看看
- IT人也经常读错的词
- Syslog4j如何实现接收日志
- webservice
- Tcl编程简介(一)
- glib库 socket通信相关的几个函数和数据结构 (二) 打开连接 发送 接收和关闭连接
- 用 Mingw gcc 编译 dll
- php写爬虫工具
- Tcl编程简介(二)
- Android应用程序打包签名
- Tcl编程简介(三)之内置命令集
- 学习的要义
- 巧用WrapPanel为ItemsControl绑定数据
- java序列化