udp connect

文章来自:http://blog.sina.com.cn/s/blog_5cc6d9950100sxax.html

udp connect()

今天在学习网络编程时,发现udp connect(),到网上查了查,分享如下:

标准的udp客户端开了套接口后,一般使用sendtorecvfrom函数来发数据,最近看到client的代码里面是使用send函数直接发的,就分析了一下,原来udp发送数据有两种方法供大家选用的,顺便把udpconnect用法也就解释清楚了。
方法一:
socket----->sendto()
recvfrom()
方法二:
socket----->connect()----->send()
recv()

首先从这里看出udp中也是可以使用connect的,但是这两种方法到底有什么区别呢?首先把这四个发送函数的定义列出来:
int send(int s,const void *msg, size_t len, int flags);
int sendto(int s, const void *msg, size_t len, int flags,
const struct sockaddr *to, socklen_t tolen);

int recv(int s, void *buf, size_t len, int flags);
int 
 recvfrom(int  s, void *buf, size_t len, int flags,
struct sockaddr *from, 
 socklen_t*fromlen);
从他们的定义可以看出,sendto和recvfrom在收发时指定地址,而send和recv则没有,那么他们的地址是在那里指定的呢,答案就在于connect.
int  connect(int  sockfd,  const  struct sockaddr *serv_addr, socklen_t
addrlen);
在udp编程中,如果你只往一个地址发送,那么你可以使用send和recv,在使用它们之前用connect把它们的目的地址指定一下就可以了。connect函数在udp中就是这个作用,用它来检测udp端口的是否开放是没有用的。下面是client中的代码

//创建、绑定、连接套接字
bool CSocketComm::ConnectTo(LPCTSTR strDestination, LPCTSTR strServiceName, intnProtocol, int nType)
{
 if ( IsOpen())                                              //如果套接字已创建则跳出
  return false;

 SOCKADDR_IN sockAddr = { 0};                                 //初始化地址信息

 SOCKET sock = socket(nProtocol, nType,0);                    //以指定的地址族、套接字类型、协议类型创建套接字
 if (sock !=INVALID_SOCKET)                                   //如果创建成功
 {
  TCHAR strHost[HOSTNAME_SIZE] = { 0};                                             //用于存放本地主机名
  if (CSocketComm::GetLocalName( strHost,sizeof(strHost)/sizeof(TCHAR)) == false)  //获取本地主机名
  {
   closesocket( sock);                                                          //关闭套接字并跳出
   return false;
  }
  sockAddr.sin_addr.s_addr = htonl( CSocketComm::GetIPAddress(strHost ) );         //获取本地IP地址
  sockAddr.sin_family =nProtocol;                                                  //获取地址族

  if(bind(sock, (LPSOCKADDR)&sockAddr, sizeof(SOCKADDR_IN))== SOCKET_ERROR)       //绑定套接字
  {
   closesocket( sock);                                                          //关闭套接字并跳出
   return false;
  }

  if (strDestination[0])                                                            //如果目标地址不为空
  {
   sockAddr.sin_addr.s_addr = htonl(CSocketComm::GetIPAddress(strDestination ) );//获取目标IP地址
  }

  sockAddr.sin_port = htons( GetPortNumber( strServiceName ));                       //获取目标端口号
  if ( sockAddr.sin_port != 0)                                                       //如果端口号不为0
  {
   if (connect( sock, (LPSOCKADDR)&sockAddr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) //连接套接字(UDP模式调用该函数可以在以后的getpeername()函数中获取已连接的目标地址信息)
   {
    closesocket( sock);                                                        //关闭套接字并跳出
    return false;
   }

   m_hComm = (HANDLE)sock;                                                        //获取连接用套接字的描述符
   return true;
  }
  closesocket( sock);                                                                //关闭套接字
 }
 return false;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值