MFC中使用socket进行文字通讯

来源:互联网 发布:编程书 编辑:程序博客网 时间:2024/06/05 09:17

本人对于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、客户端输入需要发送的字符,点发送,结束

服务器端需要接受到客户端发送的内容才会显示接收的字符,客户端需要发送后,才会显示服务器发送来的字符,服务器也才会接收显示。



0 0
原创粉丝点击