Chinaunix首页 | 论坛 | 博客
  • 博客访问: 647350
  • 博文数量: 175
  • 博客积分: 2457
  • 博客等级: 大尉
  • 技术积分: 1488
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-13 20:31
文章分类

全部博文(175)

文章存档

2012年(22)

2011年(153)

分类: C/C++

2011-09-02 17:35:45

<1> strlen(),注意传递指针时,其中的指针不能为NULL

<2>

select * from jp_fullnote t where t.agent_id = '010'

and to_char(t.begin_time,'YYYY-MM-DD')=' 2011-04-06' order by t.begin_time desc;

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

标准的udp客户端开了套接口后,一般使用sendto和recvfrom函数来发数据,最近看到client的代码里面是使用send函数直接发的,就分析了一下,原来udp发送数据有两种方法供大家选用的,顺便把udp的connect用法也就解释清楚了。
方法一:
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, int nProtocol, 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;
}

阅读(1239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~