现在在做一个基于MFC的socket程序。以TCP为例,通常的程序是有服务器端server和客户端client,首先是server.create(),然后是server.bind(),接着server.listen(),client.connect(),server.accept(),之后双方就可以进行通信(send,receive)了,但现在公司要求我实现对它的封装,要求写一个类,通过类的对象,只用一条语句send(ip,port,str)就可以任意发给想要发送的IP主机,就是create、listen、bind等等都不显示的调用,只用send就实现了发送,这该怎么实现呢,求大家帮帮忙!!

解决方案 »

  1.   

    TCP为例,那你的服务器也必须要开启监听,客户端的代码封装一下,创建SOCKET,connect服务器封装到一个函数中,比如你说的send()函数
      

  2.   

    假如把创建SOCKET,connect服务器封装到一个函数中,比如send()函数,那以后每次调用send都要创建SOCKET,再connect服务器,这显然不对吧?
      

  3.   

    你需要自己判断一下如果ip和port与之前的一样就不需要创建了。你的客户端需要维护这样一个链表结构。
      

  4.   

    send里先判断有没有connect,没有就connect,已经connect了直接send
      

  5.   

    把这些功能封装到一个函数中,这有很多的socket例子,可以看:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  6.   

    你需要自己判断一下如果ip和port与之前的一样就不需要创建了。你的客户端需要维护这样一个链表结构。
    前几天有事出去了,今天上班想了下,感觉还是不知道具体怎么写,我是不是应该分serversend和clientsend,它们分别怎么写呢,能否具体地帮忙写下啊?
      

  7.   


    void CTCPUDPSocket::TCPServerListen()
    {

    in_addr tempAddr;
    CString buf;
    LPCTSTR p;
    TCHAR send_buf[1024];
    DWORD m_ServerIp;
    //获取本地IP
    char name[128];
    CString csname;
    struct hostent *pHost;
    gethostname(name,128); //获得主机名
    pHost = gethostbyname(name);
    m_ServerIp = ntohl(((struct in_addr *)pHost->h_addr)->s_addr); tempAddr.S_un.S_addr=htonl(m_ServerIp);
    buf=inet_ntoa(tempAddr);
    p=(LPCTSTR)buf; //创建套接字,不指定方式即默认为流式套接字
    if (!Create(m_ServerPort))
    {
    AfxMessageBox(_T("调用Create ()失败,错误代码为%d"),GetLastError());
    return ;
    } Bind(m_ServerPort,p);
    Listen(5);

    }
    void CTCPUDPSocket::TCPServerSend(DWORD m_ClientIP,int m_ClientPort,CString str)
    {
    CTCPUDPSocket*  ctcpsock = new CTCPUDPSocket(); //获取客户端信息
    sockaddr_in name1;
    name1.sin_family = AF_INET;
    name1.sin_addr.S_un.S_addr = m_ClientIP;
    name1.sin_port = htons(m_ClientPort);
    int len = sizeof(name1);
    TCHAR ch[1024];
    lstrcpy(ch,str.GetBuffer(str.GetLength()));
    if(Accept(*ctcpsock,(SOCKADDR *)&name1,&len))
    ctcpsock->Send(str,strlen(ch),0);
    }
    void CTCPUDPSocket::TCPClientSend(CString str)
    {
    TCHAR ch[1024];
    lstrcpy(ch,str.GetBuffer(str.GetLength()));
    Send((char*)ch,strlen(ch),0);
    }
    void CTCPUDPSocket::TCPClientConnect(CString m_ServerIP,int m_ServePort)
    {
    Create();
    Connect(m_ServerIP,m_ServePort);
    }
    代码如上,请问该怎么整合下?
      

  8.   

    怎么没人回答了?
    再说的详细点,以TCP的服务端为例吧,代码在9L。
    假如我把TCPServerListen和TCPServerSend整合在一起成为TCPSend,这个TCPSend里面包含了create、bind、listen、accept、send这么多步骤,在外部直接通过声明一个对象s,然后s.TCPSend,则会执行以上那些步骤,而此时,需要客户端的create、connect之后,服务端的accept才会被调用。那我在外部直接使用s.TCPSend会出问题啊,5楼说的判断connect是在客户端里面,那服务器怎么弄呢?能否贴具体代码给我看下,在线等啊,等了一天了!!
      

  9.   

    如果限定条件:局域网,频度及数据量不是太大,用UDP吧
    过程要简单的多
      

  10.   

    如果非要用TCP,
    又想省事,
    找找使用socket进程间通信的例子吧,
    一般都做了封装,
    对你来说可能更适合
      

  11.   


    UDP的比较容易些,现在要弄的就是TCP的,你能否帮我找找这类封装好的例子呢?我就是在网上找了很久也没有找到封装好的例子才来提问的。
      

  12.   

    简单搜了一下,下面两个有源码,可以参考一下http://www.cnblogs.com/erwin/archive/2007/04/20/721074.htmlhttp://www.codeproject.com/Articles/12521/RCF-Interprocess-Communication-for-C
      

  13.   

    楼主的需求是“简单化”。
    作为TCP的客户端,是可以通过封装成“短连接”的形式实现的。但服务端通常不能封装。如:
    XSend :(包括connect,send,wait_response,close)
    XRecv :(包括connect,receive,close)