linux仿QQ通信系统课程设计最终修改版.docx

上传人:b****4 文档编号:1368551 上传时间:2022-10-21 格式:DOCX 页数:13 大小:19.84KB
下载 相关 举报
linux仿QQ通信系统课程设计最终修改版.docx_第1页
第1页 / 共13页
linux仿QQ通信系统课程设计最终修改版.docx_第2页
第2页 / 共13页
linux仿QQ通信系统课程设计最终修改版.docx_第3页
第3页 / 共13页
linux仿QQ通信系统课程设计最终修改版.docx_第4页
第4页 / 共13页
linux仿QQ通信系统课程设计最终修改版.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

linux仿QQ通信系统课程设计最终修改版.docx

《linux仿QQ通信系统课程设计最终修改版.docx》由会员分享,可在线阅读,更多相关《linux仿QQ通信系统课程设计最终修改版.docx(13页珍藏版)》请在冰豆网上搜索。

linux仿QQ通信系统课程设计最终修改版.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1