分类: 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;
}