现在在做一个基于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就实现了发送,这该怎么实现呢,求大家帮帮忙!!
http://download.csdn.net/detail/geoff08zhang/4571358
前几天有事出去了,今天上班想了下,感觉还是不知道具体怎么写,我是不是应该分serversend和clientsend,它们分别怎么写呢,能否具体地帮忙写下啊?
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);
}
代码如上,请问该怎么整合下?
再说的详细点,以TCP的服务端为例吧,代码在9L。
假如我把TCPServerListen和TCPServerSend整合在一起成为TCPSend,这个TCPSend里面包含了create、bind、listen、accept、send这么多步骤,在外部直接通过声明一个对象s,然后s.TCPSend,则会执行以上那些步骤,而此时,需要客户端的create、connect之后,服务端的accept才会被调用。那我在外部直接使用s.TCPSend会出问题啊,5楼说的判断connect是在客户端里面,那服务器怎么弄呢?能否贴具体代码给我看下,在线等啊,等了一天了!!
过程要简单的多
又想省事,
找找使用socket进程间通信的例子吧,
一般都做了封装,
对你来说可能更适合
UDP的比较容易些,现在要弄的就是TCP的,你能否帮我找找这类封装好的例子呢?我就是在网上找了很久也没有找到封装好的例子才来提问的。
作为TCP的客户端,是可以通过封装成“短连接”的形式实现的。但服务端通常不能封装。如:
XSend :(包括connect,send,wait_response,close)
XRecv :(包括connect,receive,close)