1.关于udp:
udp相对于tcp而言,它是不可靠的协议,不是有话说,“任何存在的东西总有其优点所在”吗?udp虽然可靠性不够高,但传输效率却很高,速度也很快,所以用的也很多。
2.通信前的注意工作:
因为采用基于windows套接口的编程,通信前,要进行初始化Windows Sockets服务。
⑴用WSAStartup()函数对windowsSocketsDLL进行初始化。
⑵在调用Windock函数之前,需要加载Wincock库
#include "winsock.h"
#include "afxsock.h"
⑶WSAStartup()与WSACleanup()是成对出现的,前者是分配资源,后者则是释放资源。
3.采用C/S模型,先分析服务器程序
if(m_hSocket!=NULL)
{
closesocket(m_hSocket);//若已经建立了套接字,先关闭
m_hSocket=NULL;
}
if(m_hSocket==NULL)
{
m_hSocket=socket(AF_INET,SOCK_DGRAM,0);//创建数据报套接字
ASSERT(m_hSocket!=NULL);
}
UpdateData();
m_addr.sin_family=AF_INET;
m_addr.sin_addr.S_un.S_addr=INADDR_ANY;
m_addr.sin_port=htons(m_port);//htons:主机字节顺序转为网络字节顺序
int ret=0;
int error=0;
ret=bind(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));//绑定套接字到本机地址
if(ret==SOCKET_ERROR)//判断绑定正确与否
{
TRACE("bind error:%d/n",(error=WSAGetLastError()));
return;
}
char buff[256];
SOCKADDR_IN from;
int fromlen=sizeof(from);
ret=recvfrom(m_hSocket,buff,256,0,(LPSOCKADDR)&from,&fromlen);//数据接收函数,参数5为[out],是源目的地址。
buff[ret]=0;
if(ret>0)
MessageBox(buff);
else MessageBox("没有收到数据!");
char *buf=buff;
char *temp="-回执!";
strcat(buf,temp);
ret=sendto(m_hSocket,buf,strlen(buf),0,(LPSOCKADDR)&from,sizeof(from));//数据发送函数
if(m_hSocket!=NULL)
closesocket(m_hSocket);//关闭套接字
4.客户端程序如下:
if(m_hSocket!=NULL)
{
closesocket(m_hSocket);//若已经建立了套接字,先关闭
m_hSocket=NULL;
}
if(m_hSocket==NULL)
{
m_hSocket=socket(AF_INET,SOCK_DGRAM,0);//创建数据报套接字
ASSERT(m_hSocket!=NULL);
}
UpdateData();
m_addr.sin_family=AF_INET;
m_addr.sin_addr.S_un.S_addr=inet_addr(m_serverip.GetBuffer(0));
m_addr.sin_port=htons(m_port);//htons:主机字节顺序转为网络字节顺序
int ret=0;
int addrlen=sizeof(m_addr);
CString str;
str += char(m_name.GetLength());
str += m_name;
str += char(m_pass.GetLength());
str += m_pass;
char* buf = str.GetBuffer(0);
ret = sendto(m_hSocket, buf, str.GetLength(),0,(LPSOCKADDR)&m_addr,addrlen);//数据发送函数,注意全部的参数都是[in]
if(ret>0)
MessageBox("数据已发送...");
char buff[256];
ret = recvfrom(m_hSocket,buff,256,0,(LPSOCKADDR)&m_addr,&addrlen);//数据接受函数,参数5为[out],参数6为[in/out]
if(ret>0)
{
buff[ret] = '/0';
MessageBox(buff);// TODO: Add extra validation here
}
else
MessageBox("没有回执消息,可能服务器程序没启动!");
if(m_hSocket!=NULL)
closesocket(m_hSocket);//关闭套接字
5.总结:
TCP与UDP协议,通信过程要注意。
在服务器程序中,TCP协议通信中,需要调用listen()监听,accept()准备接受连接,而UDP中,则没有这两个函数,它只需要等待接受数据。
而在客户端,TCP需要用到connect函数,UDP不需要(如果用到connect,虽然后面的发送和接受函数可以不用写源目的地址,但其协议仍然是无连接的)。