版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在Linux上,使用套接字接口和GTK创建网络通信程序第一章,基础知识1.1套连接器1.1.1基础知识套接字是网络进程的ID,可以简单地理解网络地址(ip地址)和端口号。 套接字接口有两种,流套接字接口使用TCP协议,数据报接口使用UDP协议。 在Linux上应用接口的操作类似于文件描述符,可以对文件进行操作。 在Linux上使用套接字接口发送数据时,必须注意字节顺序问题。 在网络传输中,以大端序方式进行传输,但本机分析的数据与CPU的结构有关,在传输到网络之前对sockaddr_in的网络地址和端口进行高字节分离套接字接口的基本操作是通过绑定、连接、监听、响应、发送、接收、关闭等以客户端/服
2、务器为中心的网络机制或套接字提供TCP服务的简化图1-1。典型地指派给套接字接口的文件描述符开始于3,其中0是默认输入,1是默认输出,2是错误默认输出,这三个描述符被固定地指派给系统,并且套接字接口的文件描述符的适当一半是适当的1/2图1-1关于1.1.2i/o使用套接字接口主要传输数据,并与I/O交换是不可避免的。 其I/O操作主要有4种模式:闭塞式、非闭塞式、多路复用和信号驱动。 本论文的程序使用了分块式的I/O,虽然简单,但是效率较低。 阻塞在套接字应用程序中很重要,如果处理不好,双方都会进入阻塞状态,造成死锁。 例如即使客户端进行read操作,由于对方不发送消息,所以read不返回返回
3、值,程序等待。1.2 GTKGTK (Gimp Tool Kit )是GNOME使用的开源接口开发程序。 因此,KDE主要使用QT。 GTK使用事件触发的结构来处理用户响应,并且该开发包包括GDK,该GDK支持多种编程语言,包括c1.3在Linux上创作c语言在这里,Linux中的c语言编辑主要使用vi,编译器使用gcc。 在Gcc编译过程中,存在静态连接库等问题,使用的命令有gcc-STD=c99 pkg-cflags- libsbgtk-2.0 -lpthread客户端. c-o客户端gcc-STD=c99 pkg-cflags- libsbgtk-2.0 -lpthread servic
4、e.c-o服务在处理字符串时,多使用stdlib.h和string.h的标准库函数,区分字符串指针和字符串数组向常数区域的差异,明确字符串数组的代入方法(使用单一要素的代入或strcat stpcpy ),在Linux中不使用itoa函数而将整数作为字符类型1.4多线程一个进程(process )把另一个进程称为多进程,具有比单个进程更大的灵活性,可以更有效地利用CPU,但是多线程是以大的存储器消耗和麻烦的进程间通信为代价产生的。多线程的不同之处在于,多线程的子线程可以访问共享存储器区域的数据,从而简化了线程之间的通信,提高了程序,特别是用户接口程序的响应。 但是,要注意使用线程同时访问变量的
5、问题,必须使用诸如互斥锁mutex之类的机制,通过每个子线程串行地访问和修改存储器中的数据来避免存储器使用冲突。多个线程可以共享相同的处理代码段,共享数据,并且共享打开的文件描述符、信号处理器、处理的当前目录、处理用户ID等。 当然,每个线程都有固有的。 线程ID、寄存器值、堆栈、错误返回代码、信号掩码和优先级。创建线程需要pthread.h头文件,连接时使用libpthread.a库。 以下是与线程相关的一些函数的简要说明。int pthread _ create (pthread _ t * tid,const pthread_attr_r *attr,void *(*func)(void
6、* ),void *arg )4个输入参数依次创建线程ID标识符、线程属性,线程执行的函数-void类型指针、传递给函数的参数(其中,参数需要转换void类型、int等类的参数,多参数Int pthread_join(pthread_t tid,void *status )等待tid线程结束,然后执行以下命令。 Status指针存储线程的返回值。pthread_t pthread_self(void )返回线程ID。pthread_cancel会终止在同一进程中生成的其他线程。 注意,如果子线程被I/O阻止(例如,读取等待),则此函数无法终止子线程,请考虑使用未被阻止的I/O来获得较高的控制权
7、和灵活性。pthread_exit结束线程本身。使用Pthread时,要避免线程的资源在线程结束时被正确释放,以避免潜在的内存泄漏问题,并在线程结束时确认该线程处于detached状态(Pthread_detach () ),请使用pthread线程可以通过自己的执行结束来结束,也可以通过调用pthread_exit ()来结束。 并且,线程a可以由线程b被动地终止,并且通过调用pthread_cancel ()来实现目的,并且cancel只是提交请求而不等待线程终止。 此线程的响应属性可以由以下两个函数设置:int pthread _ setcancestate (int state,int
8、 *oldstate )state取PTHREAD_CNACEL_ENABLE的值,以允许线程接收取消请求。int pthread _ setcancesltype (inttype,int *oldtype )设定取消的类型。 type可以为PTHREAD_CANCEL_ASYNCHRONOUS的值,并在接收到取消请求时立即处理线程。默认情况下,线程启动时的取消状态为PTHREAD_CNACEL_ENABLE,取消类型为PTHREAD_CANCEL_DEFERRED。1.5 IP地址和端口在笔者的教育网段中,各个电脑可以分配几乎独立的IP地址,各个学校的IP地址在地址之间。除非有多个网卡,否
9、则主机通常只有一个IP地址。IP地址分为内部网地址和外部网地址,内部网地址用于LAN广播,多为c网。为了唯一地确定在网络上传输数据的地址,需要IP地址和端口支持。 在该通信程序中,服务器使用固定的IP和端口,并且客户端使用其IP和随机分配的端口访问。 为了避免冲突,一般端口设定为1024以上是合理的。在Linux上运行ifconfig时,将检索本地以太网IP和本地IP。 无论系统是否连接到网络,始终存在一个名为本地网络的设备。 除非内核编译时不支持网络,否则这是一种称为环回设备的特殊设备,它自动在Linux上配置并提供网络本身的连接。 IP地址127.0.0.1是特殊的回送地址(默认本地地址)
10、,可以在自己的系统上使用telnet测试IP地址127.0.0.1。 如果inetd进程正在运行,将显示您的计算机上的登录提示。 Linux利用该特征可以进行过程和模拟网络之间的通信。1.6 TCPUDPTCP是一种面向连接的协议,可确保数据正确且按顺序到达,在Socket连接中选择SOCK_STREAM类型时使用。 因为这是面向连接的,所以在通信时需要listen-connect的三阶段握手。 发送数据时,将数据保存在缓冲区中,等待确认对方发送的数据后再明确缓冲区内的数据。 这被实施为流类型的服务,并且应用需要控制数据边界。UDP是一种无连接协议,可确保数据的即时性,但对消息大小施加限制,不
11、保证正确性。 如果套接字连接的选择类型是SOCK_DGRAM,则使用该协议。 通信时不需要握手,数据发送时从应用缓冲区直接复制数据到系统缓冲区,并返回子程序。 分组的生成是通过UDP协议实现的。 该缓冲器具有一定的大小,并且是UDP数据报的最大长度。 它实现了数据报型服务,采用了面向记录的协议。比较两者,UDP服务器通常周期性地服务多个客户,而TCP通常使用轮询和其他多线程来服务多个客户。第二章,基本的实现原理2.1基本实现结构基本实现结构在传输注册和更新信息时,使用排他锁定的多线程来确保当前信息的正确性,如图2-1中所示。 发送图b消息时,使用如图a那样直接转发的方式。 但是,若用户数多,则
12、如图c所示,存在发送的登录或更新信息导致其他用户的浪费的待机的问题。 程序内部的流程图如图2-2所示图2-1图2-22.2更多的想法改善该问题的一种想法,如下图所示,使用两台服务器,一个作为登录,另一个作为通信交换,在两台服务器之间取得同步。 当然这个实践前者很复杂,在这里那个代码没有完成。图2-3第三章,部分钥匙代码的说明3.1服务器代码3.1.1关于排他锁定下面的代码的第一行和最后一行分别获得排他锁的所有权和释放权。 尝试锁定数据的其他线程将被阻止,直到当前线程解除数据锁定为止。pthread_mutex_lock(mutex )user _ info in _ unpack.send _
13、 from .stat=0;user _ info in _ unpack.send _ from .SD=0;in_unpack.tag=LOGOUT_AWK;do_pack(in_unpack,in_pack )标志=写入(new _ SD in _ SD 、in_pack、sizeof(in_pack ) );休眠(0.1 )pthread_mutex_unlock(mutex )3.1.2关于线程的参数传递pthread _ create (thread tmp _ index ,NULL,do_service,(void*)flag_find );将int格式的flag_find设为
14、void格式的指针传递给函数do_service。3.1.3关于数据结构struct msg _ pack /messagepackstructint tag; /msg type char size:2int send_from; /msg发送自char size :8int send_to; /msg send to char size:8char key64; /keyusedforlogincharsize :8char msg 包_ msg ; /msg content char size:998定义了在write和read中包含5个要素的结构时的数据结构。3.2用户代码3.2.1关
15、于显示文本框内容的追加GTK _ text _ buffer _ get _ end _ iter (text _ buffer,ITER )GTK _ text _ buffer _ insert (text _ buffer,iter, this is it ,-1)3.2.2防止高速缓存溢出每次进行数组代入时,都要检查是否发生溢出,消除潜在的core错误。char format_cash9;format_char(send_to,format_cash,8 )int tmp _ send _ from=atoi (格式_ cash )从文本框读取数据char * log in _ IP=
16、GTK _ entry _ get _ text (GTK _ entry (message _ entry _ IP ) );第四章,运行调试结果编译service.c和client.c两个主文件时,会显示几个警告,并通过编译,调试几乎成功。 错误报告:如果服务器在客户端之前关闭,客户端会异常终止。 程序的执行示意图如下所示。图4-1参考文献宋国伟,GTK+2.0编程范例张威,Linux网络编程教程沃伦w.gay,实战Linux Socket编程附录define.h源代码#include#include#include#include#include#include#include#include#include#include#include#include#define MAXUSER 4#define BUFSIZE 100#define MYPORT 3490#define BACKLOG 10#define NO 0#define LOGIN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 聊城市初二考试试题及答案
- 光伏支架实操培训课件
- 高二会考历史试卷及答案
- 福建中考真题及答案
- 企业安全环保意识培训课件
- 8AU1-U4一轮复习-2023年江苏中考英语一轮复习(牛津译林版)
- 小学五年级语文上册语文园地五说明文数据准确性课件
- 【初中 物理】牛顿第一定律课件 -2025-2026学年人教版物理八年级下学期
- 2026年福州工业园区开发集团有限公司建设分公司项目建设合同制人员招聘备考题库附答案详解
- 2026年自贡通航机场发展有限公司公开招聘部分工作人员的备考题库有完整答案详解
- 人体工效评估程序
- EPC工程总承包项目设计及施工的配合制度
- DB21∕T 3358-2020 电梯再生制动系统要求及试验方法
- 西南大学PPT 04 实用版答辩模板
- 国家开放大学电大《政治学原理》形考任务1及4网考题库答案
- 管理百年智慧树知到答案章节测试2023年
- 国家开放大学《刑法学(1)》形成性考核作业1-4参考答案
- 工艺美术专业课程配套练习二
- 2022“博学杯”全国幼儿识字与阅读大赛选拔试卷
- 临床试验监查计划
- 安全吹哨人管理制度
评论
0/150
提交评论