欢迎来到天天文库
浏览记录
ID:8805118
大小:324.50 KB
页数:24页
时间:2018-04-08
《linux下使用套接口和gtk编写网络通信程序》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Linux下使用套接口和GTK编写网络通信程序第一章、基础知识1.1套接口1.1.1基础知识套接口(socket)就是网络进程的ID,其可以简单的理解为网络地址(ip地址)和端口号。套接口分两种,流式套接口使用TCP协议,数据报套接口使用UDP协议。在Linux中套接口的操作类似于文件描述符,可以像操作文件一样操作他们。在Linux中使用套接口发送数据要注意字节顺序的问题,在网络传输中,是以高字节在前(bigendian)的方式传送的,而本机解析这些数据,是和CPU的结构有关,在传输到网络之前,需将套接口数据结构sockaddr_in中的网络地址和端口转换为高字节在前的形
2、式。套接口的基本操作有绑定、连接、监听、应答、发送、接受、关闭等,以客户/服务器为主的网络机制其用socket进行TCP服务的简化图1-1。一般给套接口分配的文件描述符从3开始,0为默认输入,1为默认输出,2为错误默认输出,这三个描述符固定分配给系统使用,如果将套接口文件描述符设置成相应的1/2/3,则获得的数据则输出到相应的地方。图1-1241.1.2关于I/O使用套接口主要进行数据传输,不免要与I/O打交道。其I/O操作主要有四种模型:阻塞式,非阻塞,多路复用以及信号驱动。本文的程序使用的是阻塞式的I/O,其简单但效率相对较低。阻塞在套接口应用中很重要,处理不好会导致
3、双方均处于阻塞状态,造成死锁。比如客户端进行read操作,但是对方迟迟不发送信息,导致read一直没有返回值,程序便会一直等待。1.2GTKGTK(GimpToolKit)为GNOME中使用的开源界面开发程序。相应的,在KDE中主要使用的是QT。GTK使用了事件触发的结构处理用户响应,其开发包包括GDK,支持包含C之内的多种编程语言1.3Linux下的c语言编写这里Linux下的c语言编辑主要使用vi,编译程序使用gcc。Gcc编译过程中,有静态连接库等问题需要注意,使用的命令为gcc-std=c99`pkg-config--cflags--libsgtk+-2.0`-l
4、pthreadclient.c-oclientgcc-std=c99`pkg-config--cflags--libsgtk+-2.0`-lpthreadservice.c-oservice在处理字符串的时候,多应用stdlib.h和string.h里的标准库函数,区分指向常量区域的字符串指针以及字符串数组之间的区别,明确字符串数组的赋值方法(单个元素赋值或用strcatstpcpy),在Linux条件下,没有itoa函数将整型变为字符型,可以使用sprintf函数。1.4多线程一个进程(process)派生另一个进程称为多进程,其相比单一进程具有较高的灵活性,能够更有效
5、地利用CPU,但是其代价为较大的内存占用以及麻烦的进程间通信,在这样的前提下产生了多线程。多进程和多线程的区别在于,多线程中的子线程可以访问共享内存区域中的数据,简化了线程间的通信,提高了程序特别是用户界面程序的响应。但是在使用线程中要注意同时访问变量的问题,应该使用一定的机制(比如互斥锁mutex),让各个子线程以串行的方式访问并修改内存中的数据,避免出现内存使用冲突的问题。多个线程能够共享同一个进程代码段,共有数据(用来通讯),进程打开的文件描述符,信号的处理器,进程当前目录,进程用户ID等。当然每一个线程也有其独有的东西:线程ID,寄存器值,堆栈,错误返回码,信号屏
6、蔽码和优先级。创建线程需要pthread.h头文件,连接时要使用libpthread.a的库,这里简单讲解几个和线程有关的函数。Intpthread_create(pthread_t*tid,constpthread_attr_r*attr,void*(*func)(void*),void*arg)四个输入参数依次为线程ID标识符,创建线程的属性,线程将要执行的函数-返回void类型指针,以及传递给函数的参数(这里,参数需是void类型的,int等类别的参数需要进行转换,多参数传递建议使用结构体)。24Intpthread_join(pthread_ttid,void**
7、status)等待tid的线程终止,然后再执行下面的命令。Status指针内将保存线程的返回值。pthread_tpthread_self(void)返回线程ID。pthread_cancel结束其他它由同一个进程产生的线程,这里注意,当子线程阻塞在I/O时(比如,read等待),是不可以用这个函数退出次线程的,这时就要考虑使用非阻塞的I/O获得较高的控制权和灵活性。pthread_exit结束线程本身。在使用Pthread时避免线程的资源在线程结束时不能得到正确释放,从而避免产生潜在的内存泄漏问题,在对待线程结束时,要确保该
此文档下载收益归作者所有