谁能给我一个UDP的例子,不一定是源代码,可以是使用的函数的以顺序调用的名字,但必须使用CSocket ,如果不能完成也可以用CAsyncSocket
解决方案 »
- TerminateThread(hThread,0);这个函数出错了
- 怎么模拟鼠标点击程序的系统托盘图标?
- 一闪一闪的,从暗到亮(指颜色),这样重复的效果怎么实现 (一个小点)
- new/delete 和globalalloc/globalfree的不同??
- 有没有录音和放音的源程序参考一下
- 关于Combo Box的问题?
- 刚刚完成了一个局域网聊天工具,类winpopup,功能还不错,高手进来看看,跟帖有分
- 一个小问题,感觉有点怪
- 我做了一个应用程序,用来验证用户名,密码从而登陆服务器.
- 各位大哥:在sdk用handle标识对象,在mfc用pointer,如何转换?
- 请教坐标映射模式的问题!
- 如何获得系统当前的内存使用了多少,或是我这个程序当前使用的内存的多少?
SendTo
CloseClient:Create
Bind
(OnReceive)
ReceiveFrom
Close
setsockopt
bind
recvfrom
close
#include "../include/QUdp.h"
#include <assert.h>#ifdef WIN32
#include <malloc.h>
#endif#include "../include/Log4c.h"QUdpVtbl QUdplpVtbl = {
QUdpClose,
QUdpConnect,
QUdpsend,
QUdpreceive,
QUdpSetServer
};QUdp NewQUdp()
{
QUdp self;
self.lpVtbl = &QUdplpVtbl;
self.m_nPort = 0;
memset(self.m_szAddress,0,sizeof(self.m_szAddress));
return self;
}QUdp *MallocQUdp()
{
QUdp *self = (QUdp *) malloc(sizeof(QUdp));
if(!self) return NULL;
self->lpVtbl = &QUdplpVtbl;
self->m_nPort = 0;
memset(self->m_szAddress,0,sizeof(self->m_szAddress));
return self;
}int QUdpClose(QUdp *self)
{
return 0;
}BOOL QUdpConnect(QUdp *self , char * address,int port , BOOL reBind)
{
int server_len;
int i = 0;
int maxNum = 1;
assert(self); if(!address) return FALSE;
memcpy(self->m_szAddress , address , strlen(address));
self->m_nPort = port;
server_len = sizeof(self->client_addr);
// int yes = 1;
self->socketfd = socket(AF_INET, SOCK_DGRAM, 0);
if (self->socketfd == -1)
{
Log4Cperror("UDP Server unable to create server socket -- UDPMessage::Connect()\n");
return FALSE;
}
memset(&self->client_addr, 0, sizeof(self->client_addr));
self->client_addr.sin_family = AF_INET;
self->client_addr.sin_addr.s_addr = inet_addr(self->m_szAddress);
self->client_addr.sin_port = htons(self->m_nPort);
// setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&yes, sizeof(yes)); if(reBind)
{
maxNum = 20;
}
for( ; i< maxNum ;i++)
{
if (bind(self->socketfd, (struct sockaddr*)&self->client_addr, server_len) != 0)
{
self->m_nPort+=i;
self->client_addr.sin_port = htons(self->m_nPort);
}
else
{
return TRUE;
}
}
Log4Cperror("UDP Server socket bind error -- UDPMessage::Connect()\n");
return FALSE;
}int QUdpsend(QUdp *self , char *sendbuffer, unsigned int length )
{
int numbytes;
assert(self);
if( ( numbytes = sendto( self->socketfd, sendbuffer, length, 0,
(struct sockaddr *) &self->server_addr, sizeof( struct sockaddr ) ) ) == -1 ) {
Log4Cperror( "UDPMessage::send() failed\n" );
return -1;
}
return numbytes;
}int QUdpreceive(QUdp *self , char *recvbuffer, unsigned int maxlength )
{
socklen_t addrlength;
int numbytes;
assert(self);
addrlength = sizeof( struct sockaddr );
if( ( numbytes = recvfrom( self->socketfd, recvbuffer, maxlength, 0, \
(struct sockaddr *) &self->server_addr, &addrlength ) ) == -1 ) {
// Log4Cpp::perror( "UDPMessageSocket::recieve() failed\n" );
return -1;
}
return numbytes;
}void QUdpSetServer(QUdp *self , char * server, int port)
{
assert(self);
assert(server); self->server_addr.sin_family = AF_INET;
self->server_addr.sin_addr.s_addr = inet_addr(server);
self->server_addr.sin_port = htons(port);}
能否多开几个线程,我试了一下,也不行.