谁能给我一个UDP的例子,不一定是源代码,可以是使用的函数的以顺序调用的名字,但必须使用CSocket ,如果不能完成也可以用CAsyncSocket

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=440
      

  2.   

    CAsyncSocket调用序列:Server:Create
    SendTo
    CloseClient:Create
    Bind
    (OnReceive)
    ReceiveFrom
    Close
      

  3.   

    CAsyncSocket ?不会用.我的UDP操作一般是socket(AF_INET, SOCK_DGRAM, 0);
    setsockopt
    bind
    recvfrom
    close
      

  4.   

    UP.我用bsd socket的操作方式.win32兼容的.
      

  5.   


    #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);}
      

  6.   

    我用的是CSocket,每秒要接受10000条数据记录,接受时程序根本不能响应界面输入
    能否多开几个线程,我试了一下,也不行.