linux仿QQ通信系统课程设计最终修改版.docx
- 文档编号:1368551
- 上传时间:2022-10-21
- 格式:DOCX
- 页数:13
- 大小:19.84KB
linux仿QQ通信系统课程设计最终修改版.docx
《linux仿QQ通信系统课程设计最终修改版.docx》由会员分享,可在线阅读,更多相关《linux仿QQ通信系统课程设计最终修改版.docx(13页珍藏版)》请在冰豆网上搜索。
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
if
%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
if
%m\n">,exit<-1>;
printf<"Abindok\n">;
//3.recv
while<1>
{
len1=sizeof
r1=recvfrom
if
{
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
if
%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
}
//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
if
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
if
printf<"serverbindok\n">;
//3.listen
r=listen
if
printf<"serverlistenok\n">;
//4.accept
len=sizeof
cfd=accept
printf<"有人链接%d,IP:
%s,Port:
%u\n",cfd,
inet_ntoa
//5.action
while<1>
{
r=recv
buf[r]=0;
if
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux QQ 通信 系统 课程设计 最终 修改