linux仿QQ通信系统课程设计最终修改版.docx
《linux仿QQ通信系统课程设计最终修改版.docx》由会员分享,可在线阅读,更多相关《linux仿QQ通信系统课程设计最终修改版.docx(13页珍藏版)》请在冰豆网上搜索。
![linux仿QQ通信系统课程设计最终修改版.docx](https://file1.bdocx.com/fileroot1/2022-10/12/2e4aa4a8-1a88-4d19-8804-cc3d5f18feca/2e4aa4a8-1a88-4d19-8804-cc3d5f18feca1.gif)
linux仿QQ通信系统课程设计最终修改版
一、摘要
即时通信,由于具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。
设计并实现一个能够处理多用户进行实时,安全的即时通信系统具有较强的现实意义。
本文设计并实现了在linux环境里基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过socket套接字接口实现,能进行简单实时通信并能实现文件的传输。
关键字:
即时通信TCP/UDPLinux文件传输
二、需求分析
局域网仿qq通信系统能实现即时通信,并且通讯采用TCP/UDP协议。
Socket是基于TCP/IP协议之上的一个接口规范,它为应用层之间的通信提供了保障。
Socket适用于客户/服务器模式的网络应用程序设计,在使用面向连接模式时,使用TCP协议作为通信协议,为应用程序提供面向连接的服务。
用Socket进行网络通信时,需要在客户端和服务器端分别创建一个Socket,服务器端创建成功以后在特定的端口上监听客户端的连接请求。
如果有客户端的连接请求到来,则成功建立一个连接后,客户端和服务器端就可以互相进行通信了。
但只能是和客户端进行点对点的通信,即服务器只允许有一个客户端的连接,如果有连接请求到达时,服务器端需要再创建一个新的Socket与客户端进行通信,而原来的那个Socket仍处于监听状态,等待新的客户的连接请求。
三、概要设计
程序必须建立一个Socket,按照要求配置此Socket,也就是说程序要么将此Socket连接到远方的主机上,要么给此Socket指定一个本地协议端口。
程序必须按要求通过此Socket发送和接收数据,程序必须关闭此Socket。
客户端:
——创建客户端套接字〔CREATE;
——开始数据传输〔SEND、RECEIVE;
——关闭套接字〔CLOSESOCKET;
服务器端:
——创建服务器端套接字〔CREATE;
——服务器端套接字进行信息绑定〔BIND,并开始监听连接〔LISTEN;
——接受来自客户端的连接请求〔ACCEPT,并创建接收进程;
——开始数据传输〔SEND、RECEIVE;
——关闭套接字〔CLOSESOCKET。
四、详细设计
下面是实现TCP通信和UDP通信的流程
TCP通信程序的逻辑框图
UDP通信程序的逻辑框图
五、源程序和运行结果清单
#include
#include
#include
#include
#include
#include
#include
#include//文件操作头文件
#include
#include
voidMenu<>
{
printf<"\t\t|================================================\n">;
printf<"\t\t|================================================\n">;
printf<"\t\t|欢迎进入系统\n">;
printf<"\t\t|================================================\n">;
printf<"\t\t|1.UDP通信\n">;
printf<"\t\t|2.TCP通信\n">;
printf<"\t\t|3.文件传输\n">;
printf<"\t\t|4.exit\n">;
printf<"\t\t|================================================\n">;
}
void*recver
{
intfd1;//文件描述符
structsockaddr_inaddr1;
structsockaddr_inaddr_send1;//发送者地址对象
socklen_tlen1;//socket_t类型的变量len
intr1;//结果
charbuf1[200];
//1.socket
fd1=socket;/*AF是网络传输,so..是udp报文传输,0是自动比配*/
ifprintf<"socketerr:
%m\n">,exit<-1>;
printf<"Asocketok\n">;
//2.bind
addr1.sin_family=AF_INET;//全大写模式的是宏状态
addr1.sin_port=htons<9999>;
inet_aton<"127.0.0.1",&addr1.sin_addr>;
r1=bind&addr1,sizeof>;
ifprintf<"Abinderr:
%m\n">,exit<-1>;
printf<"Abindok\n">;
//3.recv
while<1>
{
len1=sizeof;
r1=recvfrom-1,0,&addr_send1,&len1>;/*从fd里取值给buf,接收从接收者送来到信息放到len来*/
if0>
{
buf1[r1]=0;
printf<"收到来自IP=%s,PORT=%hu的信息,内容如下:
\n%s\n",
inet_ntoa,
ntohs,
buf1>;//ntoa网络字节序转化为网络字符串
}
if//对方关闭
{
printf<"关闭\n">;
break;
}
if
{
printf<"网络链接失败\n">;
break;
}
}
//4.close
close;
}
void*sender<>
{
intfd1;//文件描述符
structsockaddr_inaddr1;
intr1;//结果
charbuf1[200];
//1.socket
fd1=socket;/*AF是网络传输,so..是udp报文传输,0是自动僻配*/
ifprintf<"socketerr:
%m\n">,exit<-1>;
printf<"Asocketok\n">;
//2.发送信息目标addr
addr1.sin_family=AF_INET;//全大写模式的是宏状态
addr1.sin_port=htons<9999>;
inet_aton<"127.0.0.1",&addr1.sin_addr>;
//3.recv
while<1>
{
scanf<"%s",buf1>;
r1=sendto,0,&addr1,sizeof>;/*strlen确定字符串里有效字符长度*/
}
//4.close
close;
}
intmain<>
{
intq;
Menu<>;
printf<"option:
\n">;
scanf<"%d",&q>;
switch
{
case<1>:
{
printf<"UDP通信">;
pthread_ttid;//声明整型tid
pthread_ttid2;
pthread_create<&tid,0,recver,NULL>;/*在线/进程当中创建线程,传地址是为了改变tid是指向线程的标识符的指针,0为设置线程的属性,run线程运行函数的起始地址,传给函数到参数*/
pthread_create<&tid2,0,sender,NULL>;
while<1>;break;
}
case<2>:
{
printf<"TCP通信\n">;
if>
{
intserverfd;//服务器文件描述符
intcfd;//客户端文件描述符
structsockaddr_insadr;//服务器地址
structsockaddr_incadr;//客户端地址
socklen_tlen;
intr;
inta;
charbuf[200];
//1.socket
serverfd=socket;
ifprintf<"socketerr%m\n">,exit<-1>;
printf<"serversocketok!
\n">;
sadr.sin_family=AF_INET;
sadr.sin_port=htons<9997>;
inet_aton<"127.0.0.1",&sadr.sin_addr>;
//2.bind
r=bind&sadr,sizeof>;
ifprintf<"serverbinderr%m\n">,exit<-1>;
printf<"serverbindok\n">;
//3.listen
r=listen;//监听服务器
ifprintf<"serverlistenerr%m\n">,exit<-1>;
printf<"serverlistenok\n">;
//4.accept
len=sizeof;
cfd=accept&cadr,&len>;
printf<"有人链接%d,IP:
%s,Port:
%u\n",cfd,
inet_ntoa,ntohs>;
//5.action
while<1>
{
r=recv,0>;
buf[r]=0;
if0>
printf<"收到数据:
:
%s\n",buf>;
if
{
printf<"链接断开\n">;
break;
}
if
{
printf<"网络故障\n">;
break;
}
}
close;
close;
return;
}
else
{
intfd;
structsockaddr_inaddr;
intr;
ints=0;
charbuf[200];
//1.socket
fd=socket;
if