基于套接字的聊天程序设计解析Word下载.docx
- 文档编号:17480943
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:46
- 大小:234.92KB
基于套接字的聊天程序设计解析Word下载.docx
《基于套接字的聊天程序设计解析Word下载.docx》由会员分享,可在线阅读,更多相关《基于套接字的聊天程序设计解析Word下载.docx(46页珍藏版)》请在冰豆网上搜索。
四、开发环境和语言:
(1)网络:
局域网;
(2)开发环境:
VS2005以上或VC++6.0以上版本;
(3)开放语言:
C/C++。
1通信原理分析-3-
1.1TCP协议-3-
1.3套接字的定义-4-
1.4客户机/服务器模式的运行原理-5-
2系统设计-5-
2.1基于TCP应用程序设计:
-5-
2.2基于UDP应用程序设计:
3详细设计-6-
3.1基于TCP的应用程序设计:
-6-
3.1.1服务器设计:
3.1.2客户端设计:
-9-
3.2基于UDP的应用程序设计:
-12-
3.2.1服务端设计:
3.2.2客户端设计:
-30-
4代码调试与运行结果-34-
4.1基于TCP的应用程序调试结果:
-34-
4.2基于UDP的运用程序调试结果:
-35-
5总结-38-
5.1设计不足-38-
5.2体会感想-39-
1通信原理分析
1.1TCP协议
TCP协议是一种面向连接的、可靠的传输层协议,为应用层提供可靠、全双工的数据流传输服务,TCP报文封装在IP数据报中。
在使用TCP进行通信时需要首先建立TCP连接后再能进行数据的传输,TCP连接建立为在不安全的IP网络中传输数据提供了数据完整的保障,在通信结束后要将该连接断开。
下面给出基于TCP的c/s通信工作模式:
服务器进程客户端进程
1.2UDP协议
UDP是一种无连接、尽最大努力交付的运输层协议,不提供流量控制和确认机制,数据报可能丢失、延迟、乱序到达。
这就是的UDP在实现起来就较为简单,这种简单能很好的应用在实时通信服务中,如实时语音传输、实时视频通信等。
下面给出基于UDP的c/s通信工作模式:
进程A进程B
基于udpP的c/s通信模式
1.3套接字的定义
套接字我们可以认为就是通信的一端,其主要包括协议、ip、端口号。
将两个套接字连接在一起就可以实现端到端的网络通信了。
在套接字中封装了网络和传输层协议,从而为程序员屏蔽了底层通信的复杂性。
针对不同通信的需求,在TCP/IP协议中提供了3种不同套接字类型,分别为:
流式套接字(SOCK_STREAM)、数据保式套接字(SOCK_DGRAM)、原始套接字(SOCK_RAW)。
流式套接字(SOCK_STREAM)提供面向连接的,可靠的数据传输服务,数据无差错,无重复的发送,且按发送的顺序接收,基于TCP协议。
数据保式套接字(SOCK_DGRAM)提供无连接的服务,数据包以独立包形式发送,不提供无错误的保证,数据可能丢失或重复,且接收顺序混乱,基于UDP协议。
原始套接字(SOCK_RAW)主要是在编写自定义底层协议的应用程序时使用。
1.4客户机/服务器模式的运行原理
网络应用程序一般是以客户机/服务器的模型的方式工作的。
在这种工作方式中,一个服务器程序通常事先启动,并在一个熟知端口侦听对服务器的请求。
当客户机应用程序需要某种服务时,需向提供这种服务的服务器发出请求,服务器在接收到请求后,向客户机发出相应请求信息。
这样客户机应用程序和服务器程序之间便建立了通信连接,此后可以进行数据通信。
通信任务完成后需要关闭它们之间的通信连接。
2系统设计
2.1基于TCP应用程序设计:
3详细设计
#include<
winsock2.h>
iostream>
usingnamespacestd;
string.h>
intmain(intargc,char*argv[])
{
constintDEFAULT_PORT=5000;
WORDwVersionRequested;
WSADATAwsaData;
interr,iLen;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&
wsaData);
if(err!
=0)
{
cout<
<
"
加载WinSock失败!
;
return0;
}
//创建用于监听的套接字
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);
//创建服务器监听套接字
if(sockSrv==INVALID_SOCKET)
socket()fail:
WSAGetLastError()<
endl;
SOCKADDR_INaddrSrv;
charcip[20]="
intport;
chartype;
cout<
服务器基本设置为ip:
127.0.0.1端口:
5000"
是否从新设置:
YorN"
cin>
>
type;
if(type=='
Y'
)
cout<
IP:
cip;
//ip=cip;
端口:
cin>
port;
addrSrv.sin_family=AF_INET;
addrSrv.sin_addr.S_un.S_addr=inet_addr(cip);
addrSrv.sin_port=htons(port);
else
addrSrv.sin_addr.S_un.S_addr=inet_addr("
127.0.0.1"
);
addrSrv.sin_port=htons(DEFAULT_PORT);
//绑定本地主机IP和端口
err=bind(sockSrv,(SOCKADDR*)&
addrSrv,sizeof(SOCKADDR));
bind()fail:
Serverhasbeenstartedsuccessfully..."
//监听
err=listen(sockSrv,5);
listen()fail:
Serverwaiting:
..."
SOCKADDR_INaddrClient;
intlen=sizeof(SOCKADDR);
while
(1)
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&
addrClient,&
len);
//接收客户进程连接请求
if(sockConn==INVALID_SOCKET)
{
cout<
accept()fail:
break;
}
charrecvBuf[1024]="
\0"
iLen=recv(sockConn,recvBuf,1024,0);
//接收数据
if(iLen==SOCKET_ERROR)
recv()fail:
recvBuf[iLen]='
\0'
recvBuf<
charsendBuf[1024],hostname[100];
if(gethostname(hostname,100)!
=0)//获取主机名称
strcpy(hostname,"
None"
sprintf(sendBuf,"
welcome%sconnectedto%s!
inet_ntoa(addrClient.sin_addr),hostname);
err=send(sockConn,sendBuf,strlen(sendBuf)+1,0);
//发送数据
if(err==SOCKET_ERROR)
send()fail:
while
(1)
charrecvBuf[1024]="
iLen=recv(sockConn,recvBuf,1024,0);
if(iLen==SOCKET_ERROR)
{
cout<
break;
}
recvBuf[iLen]='
cout<
请输入你要发送的消息,输入E退出"
charsendBuf[1024];
cin>
sendBuf;
stringstr=sendBuf;
if(pare("
E"
))
err=send(sockConn,sendBuf,strlen(sendBuf)+1,0);
if(err==SOCKET_ERROR)
{
cout<
break;
}
else
closesocket(sockConn);
//关闭套接字
WSACleanup();
return0;
}
3.1.2客户端设计:
//创建用于连接的套接字
SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);
if(sockClient==INVALID_SOCKET)
//stringip;
err=connect(sockClient,(SOCKADDR*)&
//请求连接服务器进程
if(err==INVALID_SOCKET)
connect()fail:
charsendBuf[1024],hostname[100];
if(gethostname(hostname,100)!
strcpy(hostname,"
strcpy(sendBuf,hostname);
strcat(sendBuf,"
haveconnetedtoyou!
err=send(sockClient,sendBuf,strlen(sendBuf)+1,0);
if(err==SOCKET_ERROR)
charrecvBuf[1024];
iLen=recv(sockClient,recvBuf,1024,0);
//接收数据
if(iLen==0)
elseif(iLen==SOCKET_ERROR)
charsendBuf[1024];
stringstr=sendBuf;
if(pare("
err=send(sockClient,sendBuf,strlen(sendBuf)+1,0);
if(err==SOCKET_ERROR)
{
return0;
}
else
charrecvBuf[1024];
iLen=recv(sockClient,recvBuf,1024,0);
if(iLen==0)
return0;
elseif(iLen==SOCKET_ERROR)
recvBuf[iLen]='
closesocket(sockClient);
CUDPSocket类,该类主要负责启动套接字,并接受客户发来的数据和发送数据
下面给出该类的源代码
////UDPSocket.h:
头文件
#pragmaonce
//CUDPSocket命令目标
#include"
afxsock.h"
classCUDPSocket:
publicCAsyncSocket
public:
CUDPSocket();
virtual~CUDPSocket();
virtualvoidOnSend(intnErrorCode);
virtualvoidOnReceive(intnErrorCode);
boolBindLocatePC(DWORDm_LocateIP,intm_LocatePort);
boolSendToRemotePC(DWORDm_RemoteIP,intm_RemotePort,CStringm_SendData);
boolm_fConnected;
//标志变量
};
//UDPSocket.cpp
//UDPSocket.cpp:
实现文件
//
stdafx.h"
UDPSocket.h"
CUDPServerDlg.h"
//CUDPSocket
CUDPSocket:
:
CUDPSocket(void)
m_fConnected=false;
~CUDPSocket(void)
//CUDPSocket成员函数
//事件响应函数(当一个套接字已经准备好了,并可以利用Send函数去发送数据时,就可以调用该函数去处理相应的消息)
voidCUDPSocket:
OnSend(intnErrorCode)
CCUDPServerDlg*pDl=CCUDPServerDlg:
GetDialog();
//pDl->
OnSend(nErrorCode);
//事件响应函数(当一个套接字准备好了,并且可以利用Receive接收时,就可以去调用该函数去处理相应的消息)
OnReceive(intnErrorCode)
pDl->
OnReceive(nErrorCode);
//地址和端口绑定
boolCUDPSocket:
BindLocatePC(DWORDm_LocateIP,intm_LocatePort)
in_addrtempAddr;
CStringbuf;
/*
LPCTSTR类型
L表示long指针这是为了兼容Windows3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中,long指针和near指针及far修饰符都是为了兼容的作用。
没有实际意义。
P表示这是一个指针;
C表示是一个常量;
T表示在Win32环境中,有一个_T宏,这个宏用来表示你的字符是否使用UNICODE,如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
STR表示这个变量是一个字符串
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
同样,LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。
LPCTSTR==constTCHAR*==constchar*
LPCSTR与char的区别
在美国国家标准下,LPCTSTR为constchar*,是常量,不可修改;
而char,是变量,可以修改。
两者的存储位置是不同的,如果强制转换的话,不安全。
*/
LPCTSTRp;
//获取本地IP
tempAddr.S_un.S_addr=htonl(m_LocateIP);
buf=inet_ntoa(tempAddr);
//将网络字节的顺序的表示的IP地址转换为点分十进制表示的IP地址
p=(LPCTSTR)buf;
//绑定本地IP/*Create函数*/
if(!
Create(htons(m_LocatePort),SOCK_DGRAM,FD_READ|FD_WRITE,p))//htons函数是将16位的端口号从主
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 套接 聊天 程序设计 解析