linux仿QQ通信系统课程设计最终修改版Word文件下载.docx
《linux仿QQ通信系统课程设计最终修改版Word文件下载.docx》由会员分享,可在线阅读,更多相关《linux仿QQ通信系统课程设计最终修改版Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
——接受来自客户端的连接请求〔ACCEPT,并创建接收进程;
——关闭套接字〔CLOSESOCKET。
四、详细设计
下面是实现TCP通信和UDP通信的流程
TCP通信程序的逻辑框图
UDP通信程序的逻辑框图
五、源程序和运行结果清单
#include<
stdio.h>
stdlib.h>
unistd.h>
string.h>
sys/socket.h>
netinet/in.h>
arpa/inet.h>
fcntl.h>
//文件操作头文件
pthread.h>
sched.h>
voidMenu<
>
{
printf<
"
\t\t|================================================\n"
;
\t\t|欢迎进入系统\n"
\t\t|1.UDP通信\n"
\t\t|2.TCP通信\n"
\t\t|3.文件传输\n"
\t\t|4.exit\n"
\t\t|================================================\n"
}
void*recver<
void*data>
intfd1;
//文件描述符
structsockaddr_inaddr1;
structsockaddr_inaddr_send1;
//发送者地址对象
socklen_tlen1;
//socket_t类型的变量len
intr1;
//结果
charbuf1[200];
//1.socket
fd1=socket<
AF_INET,SOCK_DGRAM,0>
/*AF是网络传输,so..是udp报文传输,0是自动比配*/
if<
fd1==-1>
printf<
socketerr:
%m\n"
exit<
-1>
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<
fd1,<
structsockaddr*>
&
addr1,sizeof<
addr1>
if<
r1==-1>
Abinderr:
Abindok\n"
//3.recv
while<
1>
{
len1=sizeof<
addr_send1>
r1=recvfrom<
fd1,buf1,sizeof<
buf1>
-1,0,<
addr_send1,&
len1>
/*从fd里取值给buf,接收从接收者送来到信息放到len来*/
r1>
0>
buf1[r1]=0;
收到来自IP=%s,PORT=%hu的信息,内容如下:
\n%s\n"
inet_ntoa<
addr_send1.sin_addr>
ntohs<
addr_send1.sin_port>
buf1>
//ntoa网络字节序转化为网络字符串
}
r1==0>
//对方关闭
关闭\n"
break;
r1<
网络链接失败\n"
//4.close
close<
fd1>
void*sender<
/*AF是网络传输,so..是udp报文传输,0是自动僻配*/
//2.发送信息目标addr
{
scanf<
%s"
buf1>
r1=sendto<
fd1,buf1,strlen<
0,<
/*strlen确定字符串里有效字符长度*/
intmain<
intq;
Menu<
option:
\n"
%d"
q>
switch<
case<
:
printf<
UDP通信"
pthread_ttid;
//声明整型tid
pthread_ttid2;
pthread_create<
tid,0,recver,NULL>
/*在线/进程当中创建线程,传地址是为了改变tid是指向线程的标识符的指针,0为设置线程的属性,run线程运行函数的起始地址,传给函数到参数*/
tid2,0,sender,NULL>
while<
break;
2>
TCP通信\n"
if<
fork<
{
intserverfd;
//服务器文件描述符
intcfd;
//客户端文件描述符
structsockaddr_insadr;
//服务器地址
structsockaddr_incadr;
//客户端地址
socklen_tlen;
intr;
inta;
charbuf[200];
serverfd=socket<
AF_INET,SOCK_STREAM,0>
serverfd==-1>
socketerr%m\n"
serversocketok!
sadr.sin_family=AF_INET;
sadr.sin_port=htons<
9997>
sadr.sin_addr>
r=bind<
serverfd,<
sadr,sizeof<
sadr>
r==-1>
serverbinderr%m\n"
serverbindok\n"
//3.listen
r=listen<
serverfd,10>
//监听服务器
serverlistenerr%m\n"
serverlistenok\n"
//4.accept
len=sizeof<
cadr>
cfd=accept<
cadr,&
len>
有人链接%d,IP:
%s,Port:
%u\n"
cfd,
cadr.sin_addr>
ntohs<
cadr.sin_port>
//5.action
r=recv<
cfd,buf,sizeof<
buf>
0>
buf[r]=0;
r>
收到数据:
%s\n"
buf>
r==0>
链接断开\n"
r<
网络故障\n"
}
close<
cfd>
serverfd>
return;
}
else
intfd;
structsockaddr_inaddr;
ints=0;
fd=socket<
fd==-1>