}deliver_head;
发送信息的一个完整的结构体。 typedef struct submit {
submit_head sub_head;//发送协议头结构体变量 data user_data; //用户数据结构体变量 }submit;
接收信息的一个完整的结构体。 typedef struct deliver {
deliver_head delv_head;//接受结构体头变量 data user_data; //用户数据结构体变量 }deliver;
TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)[3]。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,他是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。
如下图1基于TCP的客户/服务器模型的socket工作流程图[4]。 TCP服务端:
客户端:
建立连接 (tcp三次握手)
服务请求
服务响应
文件结束通知
图1基于TCP的客户/服务器模型的工作流程图
对于一个程序来说我们可以把它分成若干个独立执行的执行流,我们把这种称之为线程,线程可以提供多任务的处理能力[5]。在现在的大型编程中普遍使用多线程和多进程,应用多线程是为了更好的设计程序和编写和测试程序,这样一个线程来实现一个独立的功能,增加程序的可执行性。我们在使用多线程编程,要熟练的掌握线程之间的通信和同步等问题,还要了解每个线程的优先级,这样才能很好使用多线程来解决实际的问题。
启动一个线程要用到pthread_create(&tid,NULL,pthread_func,NULL)函数来实现,tid是线程号,每个线程多有一个独立的线程号,pthread_func()是线程要调用的线程函数;
在多线程的使用中要用到pthread_join()来等待要结束的线程,来确保线程能
[6]
顺利执行完成。
在多线程访问临界资源时,要使用到互斥所进行加锁,用到pthread_mutex_init()来初始化一个锁,pthread_mutex_lock()来对临界资源来进行加锁,pthread_nutex_unlock来对加锁的资源解锁,最后还要用到pthread_mutex_destory()来对锁的销毁和资源的释放。在访问临界资源时为了提高系统的处理效率要使用到条件锁和信号量来辅助完成,条件锁pthreah_cont_wait()[7]。 (1)开发语言:本短信收发系统主要应用了C语言进行开发的,应用的是linux下C语言和脚本语言shell来共同完成的。其中主要应用到的知识是Linux下的网络编程应用TCP进行连接的,采用了多线程的编程思想和最后用到脚本语言shell来对运行步骤进行优化。
(2)开发硬件平台:一部有redhat虚拟机的windows系统的个人pc。 (3)开发软件平台:Red hat enterprise linux 5, 编译器vim,调试器gdb,网络配置ifconfig,route等等。
Client端需求,本短信收发系统是基于linux C来实现的,其中客户端的需求是:client端可以实现同号码段的client端进行通信,还可以和不同号码段的client进行通信。在发送信息是可以选择发送和不发送,发送的保存在finish.txt里,不发送的保存在staff.txt里,接收到的信息保存在recv.txt里,并且client端还可以对这些信息进行查看。
Sonsever需求,二级服务器需要可以实现同号码段client信息的转发,当收到不是自己号码段的client信息时,需要把信息转发给一级服务器,然后通过一级服务把信息转发给client所在的二级服务器,这样来实现不同号码段client端的信息之间的交互。
Fatherserver需求,一级服务可以让多个不同号码段的二级服务器连接,来解决负载均衡,并且还要处理来自二级服务器的消息,转发给对应的二级服务器来实现信息的交互。 3.2.1 技术可行性
本系统是基于linux C语言下来实现短信的收发,其中主要应用到了网络编程TCP进行连接,还有GSM短信协议来实现短信的正确收发,当每连接一个client端时就启用一个线程来服务这个client,最后使用脚本shell来优化后面的运行步骤。
3.2.2 经济可行性
经济可行性是对经济能力和投资能力,后期的维护运维费用的估算,对系统的经济效益进行估算,本短信收发系统是免费提供给用户的,因为市面上有不少收费的聊天软件,可以减少用户的使用费用来增加用户的使用黏性。 3.2.3 操作可行性
本系统在使用时需要在linux系统中开一个终端来连接自己号码所在的二级服务上,因为时间的缘故并没有对界面进行优化,在操作上可能没有那么的简洁和方便。
4系统的设计和图分析
图2信息体图
如图2所示是保存信息的结构体,信息中包含发送者的号码,发送的时间和短信的具体内容。
一级:
二级:
图3二级服务器模拟图
如图3所示是两个服务器的示意图(一级和二级server),一级服务器和二级服务之间采用的是TCP连接,TCP是面向连接的可靠的传输[9],确保信息能够准确无误的传输给接收者,当每一个二级服务器连接一级服务器时,一级服务器多会开辟一个线程去服务二级服务器,并且用数组存放二级服务器连接时返回的fd和二级服务器所代表的号码段,这可以确保信息所对应的的服务器并且能够让信息正确的转发。
Client:
功能:
图4客户端功能图 如图4所示client所实现的功能,客户端连接二级服务器也是采用了TCP连接,和服务器的连接原理是一样的,客户可以实现信息的查询,可以查询收信箱,发信箱和草稿箱等功能。
N 转发
TCP连接 TCP连接 TCP连接
Y
查询 TCP连接 转发 转发
信息
Y N
图5系统工作流程图
如图5所示是系统大致的框架和功能示意图。当client发送一个信息时就会提示是否发送,发送就会保存在发信箱中如果不发送就保存在草稿箱子中。Client把信息发给自己号码所在的二级服务器时,二级服务器就会检查要发送至的号码是否是自己管理的号码段,如果是自己就把信息转发给本号码段的client,如果不是自己号码段的client就把信息转发给一级服务器让一级服务器进行处理,一级服务器收到信息时就会检查信息的号码在哪个二级服务器所管理的号码段,然后把信息转发给对应的二级服务器,最后二级服务器把信息转发给对应的client,当client端收到信息时就会打印出信息的内容并把信息保存在收信箱中。
5系统的实现和代码分析
图6一级服务器运行图
如图6所示是一级服务器的运行结果。
每连接一个二级服务器多会返回一个fd和它所对应的号码段,然后把这些数据保存在一个数组里面,供后面信息的匹配和查询。 client.fd = cfd;
strcpy(client.num,buf);
client.address = all_address; all_address[geshu].fd = cfd;
strcpy(all_address[geshu].num,buf);
每连接一个二级服务器多会创建一个线程去服务它,并且要把连接上二级服务器数加1,和线程数匹配起来。
send(cfd,\
pthread_create(&client.tid,NULL,fun,(void *)&client); geshu ++;
这是处理来自二级服务器的转发请求,通多号码段的匹配吧信息转发给对应的二级服务器上,实现信息的交互。
for(i = 0;i < geshu;i++) {
if(0 ==
strncmp(send_msg.delv_head.oa_add,client.address[i].num,3)) {
send(client.address[i].fd,&send_msg,sizeof(send_msg),0); } }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于C的短信收发系统的设计与实现毕业设计 - 图文(2)在线全文阅读。
相关推荐: