首先是UDP和TCP的区别:
UDP是不连接服务器,每次发送数据的时候需要服务器的IP;而TCP是先连接服务器,保持常连接,然后直接发送不需要IP。
下面是TCP客户端:
1、新建项目,TestCSocket。
2、新建一个CSocket的派生类,CSockSon:CSocket。是因为只有CSocket的的虚函数OnReceive才可以在客户端上接收数据,而一个纯CSocket对象的OnReceive是空的,
所以后面要重写此函数来处理接收数据。
3、获得CSockSon的对象。
在Dlg.h中定义一个CSockSon对象:public:CSockSon m_sock;
首先需要在AppInit中初始化SOCKEt:AfxSocketInit();(为什么要初始化可以看Winapi,无非就是打包底层api函数);
在连接按钮函数里:m_sock.Create();(这里可以不加参数,因为是TCP,所有参数在Connect里加入);
m_socku.Connect(CString("192.168.43.74"),8080);(然后连接到服务器IP,没写的参数都是缺省值,代表TCP)
此时已经创建了一个连接到服务器的套接字对象。
4、发送数据到服务器。
m_sock.Send("123","123".GetLenth(),...);(反正TCP就是使用这个函数来发送数据,而UDP是使用SendTo,SendTo里制定了Ip)
5、接收数据。
首先在Dlg.cpp中增加一个方法,用于将从OnReceive中接收到的数据打印出来。
void TestCSocket::OnReceive(LPCTSTR text)//注意两个OnReceive是不一样的,这个是自定义的,text是socket对象的OnReceive方法回调信息,代表接收数据
{
MessageBox(text);
}
接下来,需要在回调函数中将获取的数据传到上面那个函数里。在第二步中的派生类的CSockSon.cpp中重写虚函数OnReceive():
void CSockU::OnReceive(int nErrorCode)
{
CString sziP;//用来存发来IP
UINT nPort;//端口
char s[512];//数据
int rLen=ReceiveFrom(s,sizeof(s),sziP,nPort);//返回值,成功就返回接收长度
s[rLen]=0;//是为了不出现乱码
CTestCSocketDlg *pDlg= (CTestCSocketDlg*)AfxGetMainWnd();//获得主窗口的句柄,需要加入主窗口的头文件#include "TestCSocketDlg.h"
pDlg->OnReceive(s);//调用自定义函数,把s传过去
CSocket::OnReceive(nErrorCode);
}
注意:CWnd* AfxGetMainWnd( );
就是获得应用程序主窗口的指针,AfxGetMainWnd()-> m_hWnd是主窗口的句柄
6、判断一个CSocket是否Create成功:m_socket.m_hSocket == INVALID_SOCKET