socket编程基本步骤(mfc socket 编程的流程是怎么样的)

本文目录
mfc socket 编程的流程是怎么样的
初始化socket
首先需要调用AfxSocketInit()函数来初始化我们的socket环境。
为了初始化sockets,我们需要调用AfxSocketInit()函数。它通常是在MFC中的InitInstance()函数中被调用的。如果我们用程序向导来创建socket程序的话,查看“use Windows Sockets”这个选项,然后选中它。它将会自动的为我们创建这个步骤了。(如果我们没有选中这个选项的话,我们也可以手动添加这些代码的。)这个函数的返回值显示这个函数的调用成功或失败。
BOOL CServerApp::InitInstance()
{....
if( AfxSocketInit() == FALSE)
{
AfxMessageBox("Sockets Could Not Be Initialized");
return FALSE;
}
...
}
创建Server Sockets
为了创建一个Server Socket,我们需要声明一个CAyncSocket的变量或者我们自己定制的一个从AyncSocket或是Cscket继承来的类的类型的变量。然后调用Create()函数,同时指定监听的端口。这个函数的返回值显示这个函数的调用成功或失败。
UpdateData(TRUE);
m_sListener.Create(m_port);
if(m_sListener.Listen()==FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
创建Client Sockets
为了创建Client socket类,我们需要声明一个CAyncSocket的变量或者我们自己定制的一个从AyncSocket或是Cscket继承来的类的类型的变量。然后调用Create()函数,同时指定监听的端口。这个函数的返回值显示这个函数的调用成功或失败。
m_sConnected.Create();
m_sConnected.Connect("server ip",port);
监听客户端的连接
创建了server socket以后,我们要进行监听。调用Listen()函数。这个函数的返回值显示这个函数的调用成功或失败。
if( m_sListener.Listen()== FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
接受连接
连接请求要被接受accept,是用另外的socket,不是正在监听的socket。请参看代码。
void CXXXDlg::OnAccept()
{
CString strIP;
UINT port;
if(m_sListener.Accept(m_sConnected))
{
m_sConnected.GetSockName(strIP,port); //应该是GetPeerName,获取对方的IP和port
m_status="Client Connected,IP :"+ strIP;
m_sConnected.Send("Connected To Server",strlen("Connected To Server"));
UpdateData(FALSE);
}
else
{
AfxMessageBox("Cannoot Accept Connection");
}
}
发送数据
数据放在一个buffer中或是结构体中,调用send()函数发送。
m_sConnected.Send(pBuf,iLen);
接受数据
调用receive()接受数据。
void CXXXrDlg::OnReceive()
{
char *pBuf =new char ;
CString strData;
int iLen;
iLen=m_sConnected.Receive(pBuf,1024);
if(iLen == SOCKET_ERROR)
{
AfxMessageBox("Could not Recieve");
}
else
{
pBuf=NULL;
strData=pBuf;
m_recieveddata.Insert(m_recieveddata.GetLength(),strData);
//display in server
UpdateData(FALSE);
m_sConnected.Send(pBuf,iLen); //send the data back to the Client
delete pBuf;
}
}
关闭连接
m_sConnected.ShutDown(0); 停止发送数据
m_sConnected.ShutDown(1); 停止接受数据
m_sConnected.ShutDown(2); 停止发送接受数据
m_sConnected.Close();
编写自己的socket类
在class view中选择添加一个新类,设置它的基类为CAsyncSocket,在类向导的帮助下添加如下的一些函数。
class MySocket : public CAsyncSocket
{ // Attributes
public:
// Operations
public:
MySocket();
virtual ~MySocket();
// Overrides
public:
void SetParentDlg(CDialog *pDlg);// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(MySocket)
public:
virtual void OnAccept(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnOutOfBandData(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
//}}AFX_VIRTUAL // Generated message map functions
//{{AFX_MSG(MySocket)
// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG
protected:
private:
CDialog * m_pDlg;
};
设置“Parent Dialog”
调用这个socket类的SetParentDlg函数,保证当socket事件发生的时候这个窗体能接收到。
m_sListener.SetParentDlg(this);
m_sConnected.SetParentDlg(this);
建立Socket 事件和窗体成员函数之间的联系
在这个窗体类中添加一些函数,比如void OnReceive(); void OnClose(); void OnAccept(); void OnConnect()等,它们会在我们编写的的socket类中调用到。
void MySocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(nErrorCode==0)
{
((CServerDlg*)m_pDlg)-》OnAccept();
}
CAsyncSocket::OnAccept(nErrorCode);
}
C语言socket编程之我的应用
以往上位机程序我们一般都是通过232、485和PLC通信,232通信受到距离的限制,485距离能够满足要求,也有不足的地方受环境干扰比较大,切传输过程中速度不怎么快,新的课题通过网口与PLC通信,西门子的PLC我们用过网口作为传输介质,速度可以而且使用起来方便,只需一根网线就可以调试程序了,这次的课题是以OMR的PLC作为控制PLC,上位机程序(也就是大家说的组态软件)我们自己来写,我会写出一系列的课程把我们实现的过程与大家一起分享,也希望做这快的朋友一起来讨论。
今天是入门课利用socket实现TCP/IP通信编程,实现两台电脑通过IP互联。
socket编程的教材网上搜罗下还是很多的,思路基本上也是一样的,程序分两部分客户端和服务器端
第一部分 服务器端
一、创建服务器套接字(create)。
二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
三、接受来自用户端的连接请求(accept)。
四、开始数据传输(send/receive)。
五、关闭套接字(closesocket)。
socket接收、发送代码
1 SOCKET sockConn=accept(sockSrv,(SOCKADDR*)addrClient,len);
2 char sendBuf;
3 sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
4 send(sockConn,sendBuf,strlen(sendBuf)+1,0);
5 char recvBuf;
6 recv(sockConn,recvBuf,50,0);
7 printf("%s\n",recvBuf);
8 closesocket(sockConn);
第二部分 用户端
一、创建用户套接字(create)。
二、与远程服务器进行连接(connect),如被接受则创建接收进程。
三、开始数据传输(send/receive)。
四、关闭套接字(closesocket)。
客户端代码
1 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
2
3 SOCKADDR_IN addrSrv;
4 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
5 addrSrv.sin_family=AF_INET;
6 addrSrv.sin_port=htons(6000);
7 connect(sockClient,(SOCKADDR*)addrSrv,sizeof(SOCKADDR));
8 send(sockClient,"hello",strlen("hello")+1,0);
9 char recvBuf;
10 recv(sockClient,recvBuf,50,0);
11 printf("%s\n",recvBuf);
服务器端代码和客户端主要代码基本上都是上面的程序,
在应用的过程中有几点要根据自己的需求更改,
1、127.0.0.1是服务器端的IP地址,根据自己的IP段进行修改;
2、htons(6000)是端口号根据具体设定进行修改,我们PLC端口号用到是9600,这点我们需要修改成9600。
网上好多程序都是VC6写的,在参考过程中叶遇到了问题,程序LICK出现了如下错误
unresolved external symbol __imp__closesocket@4
解决办法:
这是由于VC库中没有加如 ws2_32.lib 所致。
解决方案一:程序代码中加入#pragma comment(lib, "Ws2_32.lib")
解决方案二:在project\setting\link 中object/library modules加入 ws2_32.lib
这个是VC6的解决方案,我用的VS2008找了一下
上个图吧,VS2008里设置,工程属性-链接器-命令行-附加选项添加 ws2_32.lib就ok了。
编译通过后,服务器端,可以看到hello,
客户端,可以看到welcome 127.0.0.1 to here!
在C#中利用Socket进行网络通信编程的一般步骤是
1.创建socket
2.确定本地计算机端点(ip和端口号)
3.socket绑定端点
4.socket.receive(); 接收数据
5.socket.send();发送数据
6.socket.close();关闭socket

更多文章:
struts作用(请简单谈一下spring,struts,hibernate的作用;)
2026年10月22日 05:20
low power是什么意思(MP3打开以后提示Low power!是什么意思啊)
2026年10月22日 03:50
律师资格证报考条件非法律专业(不是法学专业的可以考律师证吗)
2026年10月22日 02:40
变量名可以是汉字吗(c++变量可以是中文吗,我大一刚学c++,这个不是太懂)
2026年10月22日 00:50
evaluate带有文字的用法(Excel 请教高手在怎么设置带文字标注的计算表)
2026年10月22日 00:30
dubbo远程调用注解(怎么用注解的方式发布dubbo服务)
2026年10月21日 19:10
数据库常用sql语句管理(通用SQL数据库查询语句精华使用简介)
2026年10月21日 17:30




