MFC中使用socket进行文字通讯
2016-09-19 22:15
155 查看
本人对于C++编程的水平和新手差不多,此文章作为平时的笔记而保存方便往后自己可以回顾一下。
刚刚接触winsocket不久,具体socket简介可去百度,简单介绍,就是一个用来通讯的东西。
socket通讯需要创建一个服务器端,然后创建一个客户端,双方进行通讯。
socket的一些常用的函数如下:
CSocket::Create 初始化(一般写服务器程序都不要用为好,下面的例子将使用CSocket::Socket 初始化)
Socket::Socket初始化
CSocket::SetSockOpt 设置socket选项
CSocket::Bind 绑定地址端口
CSocket::Connect 连接
CSocket::Listen 监听
CSocket::Accept 接收外部连接的socket
CSocket::Send 发送内容
CSocket::Receive 接收内容
CSocket::Close 关闭(不等于delete)
一下这段是复制别人的,觉得不错作为参考,原文:http://blog.csdn.net/openn/article/details/8202465
1,初始化一个Winsock
AfxSocketInit() 这个函数,在使用CSocket前一定要先调用该函数,否则使用CSocket会出错;并且该函数还有一个重要的使用方式,
就是在某个线程下使用 CSocket 前一定要调用,就算主线程调用了该函数,在子线程下使用 CSocket 也要先调用该函数,要不会出错。
2,创建2一个socket链接
服务端最好不要使用aSocket.Create创建,因为容易会出现10048错误,直接用 Socket
还要注意的是, Create 方法已经包含了 Bind 方法,如果是以 Create 方法初始化的前提下不能再调用 Bind ,要不一定出错。
3,设置一些socket的选项,其实我也不知道这些什么意思,网上看到的。。能解决10048错误,是用SetSockOpt方法
4,因为是用的socket创建,所以需要用bind方法绑定一个端口,这个端口要其他进程没有是用的。如果不知道哪些端口被是用,可以谷歌查询一下。
5,绑定好了,就可以开始监听了。。是用脑listen方法
6,是用循环,用Accept 来接收外部,链接。。。。
7,如果接收到数据,用Receive 来接收参数,,然后用send发送参数,关闭接收socket链接。。继续监视。如果没有接收到数据,则跳出循环。
一下是例子,是MFC的例子。
服务器端:
1、先使用AfxSocketInit()创建套接字。
2、创建2个CSocket,一个用于初始化、链接、监听,另一个用于接收客户端发送回来的内容。
3、使用Socket()初始化。
4、使用Bind(port)绑定,port代表客户端端口号,一般为1025到49151,只要服务器和客户端的port设置都是同一个端口就可以整除通讯了。
5、通讯
服务器端代码:
//初始化winsock,套接字
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
}
CSocket aSocket, serverSocket; //创建2个CSocket
if (!aSocket.Socket()) //初始化CSocket,不用Create,而是Socket
{
char szError[256] = { 0 };
sprintf(szError, "Create Faild:%d", GetLastError());
CString Er(szError);
AfxMessageBox(Er);
}
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
//设置Socket的选项, 解决10048错误必须的步骤
aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET); //这个的用法我不清楚,可以上网查
//绑定
if (!aSocket.Bind(4567)) //正确返回0,否则SOCKET_ERROR
{
char szError[256] = { 0 };
sprintf(szError, "Bind Faild:%d", GetLastError());
CString Er(szError);
AfxMessageBox(Er);
}
//监听
if (!aSocket.Listen(10))
{
char szError[256] = { 0 };
sprintf(szError, "Listen Faild:%d", GetLastError());
CString Er(szError);
AfxMessageBox(Er);
}
CString strText;
if (!aSocket.Accept(serverSocket)) //外部链接
{
// continue;
AfxMessageBox(_T("外部链接失败!"));
}
else
{
char szRecvMsg[256] = { 0 };
char szOutMsg[25] = { 0 };
GetDlgItemText(IDC_EDIT1, strText); //我MFC中的输入编辑框的ID
serverSocket.Send(strText, 50); //发送内容给客户端
strText = "";
serverSocket.Receive(szRecvMsg, 256); //接收客户端内容:阻塞模式,等待接收到客户端发送回来的字符才会继续往下执行
// sprintf(szOutMsg, "接收到的参数是:%s \r\n", szRecvMsg);
//显示接收到的字符
sprintf(szOutMsg, szRecvMsg);
strText += szOutMsg;
SetDlgItemText(IDC_EDIT2, strText); //我MFC显示接收字符的编辑框的ID
serverSocket.Close(); //关闭
}
aSocket.Close();
serverSocket.Close();
// AfxMessageBox(_T("已关闭"));
客户端:
1、创建套接字
2、创建CSocket
3、初始化
4、连接
5、通讯
客户端代码:
AfxSocketInit(); //创建套接字
CSocket aSocket; //创建CSocket
CString strIP; //服务器的IP地址,若是本机的IP就为127.0.0.1
CString strPort; //连接的端口号,与服务器的一致即可
CString strText;
strIP = "127.0.0.1";
strPort = "4567";
GetDlgItemText(IDC_EDIT1, strText); //获取MFC编辑框的输入内容
//初始化CSocket对象,因为客户端不需要绑定任何端口和地址,所以默认参数即可
if (!aSocket.Create()) //因为是客户端所以使用Create初始化没问题,使用Create后不用使用Bind进行连接
{
char szMsg[1024] = { 0 };
sprintf(szMsg, "Create faild:%d", aSocket.GetLastError());
CString Er(szMsg);
AfxMessageBox(Er);
}
//转换需要连接的端口内容类型
int nPort = atoi(strPort);
//连接指定的地址和端口
if (aSocket.Connect(strIP, nPort))
{
char szRecValue[1024] = { 0 };
aSocket.Send(strText, strText.GetLength()); //发送内容给服务器
aSocket.Receive((void *)szRecValue, 1024); //接收服务器发来的内容(该方式会阻塞,在此等待有内容接收到才能继续向下执行)
CString Re(szRecValue);
SetDlgItemText(IDC_EDIT2, Re);
// AfxMessageBox(Re);
}
else
{
char szMsg[1024] = { 0 };
sprintf(szMsg, "Create faild:%d", aSocket.GetLastError());
CString Er(szMsg);
AfxMessageBox(Er);
}
aSocket.Close();
以上就可以创建好2个项目,一个为服务器,一个为客户端。
一下使用过程是为新手提供的,因为我第一次也很混乱,创建好了,不知道怎么用。
1、服务器端输入需要发送的字符,点发送,等待客户端回复
2、客户端输入需要发送的字符,点发送,结束
服务器端需要接受到客户端发送的内容才会显示接收的字符,客户端需要发送后,才会显示服务器发送来的字符,服务器也才会接收显示。
刚刚接触winsocket不久,具体socket简介可去百度,简单介绍,就是一个用来通讯的东西。
socket通讯需要创建一个服务器端,然后创建一个客户端,双方进行通讯。
socket的一些常用的函数如下:
CSocket::Create 初始化(一般写服务器程序都不要用为好,下面的例子将使用CSocket::Socket 初始化)
Socket::Socket初始化
CSocket::SetSockOpt 设置socket选项
CSocket::Bind 绑定地址端口
CSocket::Connect 连接
CSocket::Listen 监听
CSocket::Accept 接收外部连接的socket
CSocket::Send 发送内容
CSocket::Receive 接收内容
CSocket::Close 关闭(不等于delete)
一下这段是复制别人的,觉得不错作为参考,原文:http://blog.csdn.net/openn/article/details/8202465
1,初始化一个Winsock
AfxSocketInit() 这个函数,在使用CSocket前一定要先调用该函数,否则使用CSocket会出错;并且该函数还有一个重要的使用方式,
就是在某个线程下使用 CSocket 前一定要调用,就算主线程调用了该函数,在子线程下使用 CSocket 也要先调用该函数,要不会出错。
2,创建2一个socket链接
服务端最好不要使用aSocket.Create创建,因为容易会出现10048错误,直接用 Socket
还要注意的是, Create 方法已经包含了 Bind 方法,如果是以 Create 方法初始化的前提下不能再调用 Bind ,要不一定出错。
3,设置一些socket的选项,其实我也不知道这些什么意思,网上看到的。。能解决10048错误,是用SetSockOpt方法
4,因为是用的socket创建,所以需要用bind方法绑定一个端口,这个端口要其他进程没有是用的。如果不知道哪些端口被是用,可以谷歌查询一下。
5,绑定好了,就可以开始监听了。。是用脑listen方法
6,是用循环,用Accept 来接收外部,链接。。。。
7,如果接收到数据,用Receive 来接收参数,,然后用send发送参数,关闭接收socket链接。。继续监视。如果没有接收到数据,则跳出循环。
一下是例子,是MFC的例子。
服务器端:
1、先使用AfxSocketInit()创建套接字。
2、创建2个CSocket,一个用于初始化、链接、监听,另一个用于接收客户端发送回来的内容。
3、使用Socket()初始化。
4、使用Bind(port)绑定,port代表客户端端口号,一般为1025到49151,只要服务器和客户端的port设置都是同一个端口就可以整除通讯了。
5、通讯
服务器端代码:
//初始化winsock,套接字
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
}
CSocket aSocket, serverSocket; //创建2个CSocket
if (!aSocket.Socket()) //初始化CSocket,不用Create,而是Socket
{
char szError[256] = { 0 };
sprintf(szError, "Create Faild:%d", GetLastError());
CString Er(szError);
AfxMessageBox(Er);
}
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
//设置Socket的选项, 解决10048错误必须的步骤
aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET); //这个的用法我不清楚,可以上网查
//绑定
if (!aSocket.Bind(4567)) //正确返回0,否则SOCKET_ERROR
{
char szError[256] = { 0 };
sprintf(szError, "Bind Faild:%d", GetLastError());
CString Er(szError);
AfxMessageBox(Er);
}
//监听
if (!aSocket.Listen(10))
{
char szError[256] = { 0 };
sprintf(szError, "Listen Faild:%d", GetLastError());
CString Er(szError);
AfxMessageBox(Er);
}
CString strText;
if (!aSocket.Accept(serverSocket)) //外部链接
{
// continue;
AfxMessageBox(_T("外部链接失败!"));
}
else
{
char szRecvMsg[256] = { 0 };
char szOutMsg[25] = { 0 };
GetDlgItemText(IDC_EDIT1, strText); //我MFC中的输入编辑框的ID
serverSocket.Send(strText, 50); //发送内容给客户端
strText = "";
serverSocket.Receive(szRecvMsg, 256); //接收客户端内容:阻塞模式,等待接收到客户端发送回来的字符才会继续往下执行
// sprintf(szOutMsg, "接收到的参数是:%s \r\n", szRecvMsg);
//显示接收到的字符
sprintf(szOutMsg, szRecvMsg);
strText += szOutMsg;
SetDlgItemText(IDC_EDIT2, strText); //我MFC显示接收字符的编辑框的ID
serverSocket.Close(); //关闭
}
aSocket.Close();
serverSocket.Close();
// AfxMessageBox(_T("已关闭"));
客户端:
1、创建套接字
2、创建CSocket
3、初始化
4、连接
5、通讯
客户端代码:
AfxSocketInit(); //创建套接字
CSocket aSocket; //创建CSocket
CString strIP; //服务器的IP地址,若是本机的IP就为127.0.0.1
CString strPort; //连接的端口号,与服务器的一致即可
CString strText;
strIP = "127.0.0.1";
strPort = "4567";
GetDlgItemText(IDC_EDIT1, strText); //获取MFC编辑框的输入内容
//初始化CSocket对象,因为客户端不需要绑定任何端口和地址,所以默认参数即可
if (!aSocket.Create()) //因为是客户端所以使用Create初始化没问题,使用Create后不用使用Bind进行连接
{
char szMsg[1024] = { 0 };
sprintf(szMsg, "Create faild:%d", aSocket.GetLastError());
CString Er(szMsg);
AfxMessageBox(Er);
}
//转换需要连接的端口内容类型
int nPort = atoi(strPort);
//连接指定的地址和端口
if (aSocket.Connect(strIP, nPort))
{
char szRecValue[1024] = { 0 };
aSocket.Send(strText, strText.GetLength()); //发送内容给服务器
aSocket.Receive((void *)szRecValue, 1024); //接收服务器发来的内容(该方式会阻塞,在此等待有内容接收到才能继续向下执行)
CString Re(szRecValue);
SetDlgItemText(IDC_EDIT2, Re);
// AfxMessageBox(Re);
}
else
{
char szMsg[1024] = { 0 };
sprintf(szMsg, "Create faild:%d", aSocket.GetLastError());
CString Er(szMsg);
AfxMessageBox(Er);
}
aSocket.Close();
以上就可以创建好2个项目,一个为服务器,一个为客户端。
一下使用过程是为新手提供的,因为我第一次也很混乱,创建好了,不知道怎么用。
1、服务器端输入需要发送的字符,点发送,等待客户端回复
2、客户端输入需要发送的字符,点发送,结束
服务器端需要接受到客户端发送的内容才会显示接收的字符,客户端需要发送后,才会显示服务器发送来的字符,服务器也才会接收显示。
相关文章推荐
- iOS 使用第三方库CocoaAsyncSocket进行Tcp通讯
- 如何基于TCP/IP协议进行MFC Socket网络通讯编程
- 在java中,使用域名进行socket通讯
- QT单实例应用,使用QLocalSocket进行进程通信,不同运行权限下运行的同一个进程通讯失败,报错 “QLocalSocket::SocketAccessError”
- JAVA使用Socket进行异步通讯
- C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架(一)----基础类库部分
- 一步一步教你使用.net进行Socket通信
- 使用C#进行点对点通讯和文件传输(通讯基类部分)(转)
- 使用C#进行点对点通讯和文件传输(通讯基类部分)
- 使用C#进行点对点通讯和文件传输(发送接收部分)
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- 使用C#开发Socket通讯
- 使用C#进行点对点通讯和文件传输(发送接收部分)
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- 使用php通过Socket进行发信源码,支持发信认证
- 一步一步教你使用.net进行Socket通信之进阶篇