您的位置:首页 > 其它

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、客户端输入需要发送的字符,点发送,结束
服务器端需要接受到客户端发送的内容才会显示接收的字符,客户端需要发送后,才会显示服务器发送来的字符,服务器也才会接收显示。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐