笔记-Socket通信-基本操作(启动/连接/发送/关闭)

Socket通信-基本操作

a)    端口服务启动

     // 初始化Socket

     m_socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   

     if(m_socketServer ==INVALID_SOCKET)

     {

         AfxMessageBox(_T("创建Socket失败!"));

         return ;

     }

 

     // 初始化Socket套接字

     sockaddr_in sockaddrOfServer;

     sockaddrOfServer.sin_family=AF_INET;

     sockaddrOfServer.sin_port=htons(MY_SERVE_PORT);//设置的端口

     sockaddrOfServer.sin_addr.s_addr =inet_addr(MY_SERVER_ADDRESS);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。

 

     // 将socket绑定所创建的套接字上:绑定网络、IP、端口

     if(bind(m_socketServer,(LPSOCKADDR)&sockaddrOfServer,sizeof(sockaddrOfServer)) == SOCKET_ERROR )

     {

         AfxMessageBox(_T("绑定端口失败!"));

         closesocket(m_socketServer);

         return ;

     }

 

     //创建监听线程,响应发送过来的消息:消息响应函数ListenThread

     DWORD dwThreadID = 0;

     m_handleSocketServer = ::CreateThread(NULL, 0,ListenThread, &m_socketServer, 0, &dwThreadID);

//listen(m_socketServer, 40);  //开始监听socket:阻塞直到有客户端连接

     //char szBuf[MAX_PATH] = {0};    //初始化

     //while(1) 

     //{ 

     //   SOCKET ConnectSocket = accept(m_socketServer, NULL, 0); //阻塞直到有客户端连接

     //   if(ConnectSocket == -1) 

     //  

     //       AfxMessageBox(_T("accept error!"));

     //       continue; 

     //   }

     //   // 接收消息

     //   int nReceiveLen = recv(ConnectSocket, szBuf, 100, 0);

     //   // 界面上显示请求数据。

     //   szBuf[nReceiveLen] = '\0';

     //   strcat(szBuf,": 收到)");

     //   // 向客户端发送回应数据

     //   send(ConnectSocket,szBuf,100,0);

     //} 

 

b)    端口服务响应

     //创建监听线程,响应发送过来的消息:消息响应函数ListenThread,传递socket作为参数

     DWORD dwThreadID = 0;

     m_handleSocketServer = ::CreateThread(NULL, 0,ListenThread, &m_socketServer, 0, &dwThreadID);

 

//消息响应函数ListenThread

DWORD WINAPI ListenThread(LPVOIDlpparam)

{

     SOCKET  Listening = *(SOCKET*)lpparam;

     //开始监听是否有客户端连接。listen()仅适用于支持连接的套接口,如SOCK_STREAM类型的。

     if(listen(Listening,40) ==SOCKET_ERROR)

     {

         return 0;

     }

     char szBuf[MAX_PATH];

     //初始化

     memset(szBuf,0,MAX_PATH);

     while(1)

     {

         SOCKET ConnectSocket;

         sockaddr_in    ClientAddr;

         int            nLen = sizeof(sockaddr);

         // 阻塞直到有客户端连接,不然多浪费CPU资源。

         ConnectSocket = accept(Listening,(sockaddr*)&ClientAddr,&nLen);

         // 接收消息

         int nReceiveLen = recv(ConnectSocket,szBuf, 100, 0);

         // 界面上显示请求数据。

         szBuf[nReceiveLen] ='\0';

         strcat(szBuf,":收到)");

         // 向客户端发送回应数据

         send(ConnectSocket,szBuf,100,0);

}

     return 0;

}

 

c)     客户端连接端口,收发消息

     // 初始化socket

     SOCKET socketClient;

     socketClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   

 

     // 初始化套接字

     SOCKADDR_IN socServer;

     socServer.sin_family =AF_INET;                         //声明地址格式是TCP/IP地址格式

     socServer.sin_port =htons(MY_SERVE_PORT);                 //指明连接服务器的端口号

     socServer.sin_addr.s_addr =inet_addr(MY_SERVER_ADDRESS);  //指明连接服务器的IP地址

 

     // 建立socket连接到套接字指向的网络、IP、端口

     if (connect(socketClient, (structsockaddr *)&socServer,sizeof(SOCKADDR_IN)) < 0)//连到刚才指明的服务器上

     {

         closesocket(socketClient);

         AfxMessageBox(_T("连接服务器失败"));

         return;

     }

 

     // 发送

     UpdateData(TRUE);

     send(socketClient, (LPCTSTR)m_sSendContent,m_sSendContent.GetLength(), 0);

 

     // 接受返回

     recv(socketClient,m_sReceiveContent.GetBuffer(100), 100, 0);

     m_sReceiveContent.ReleaseBuffer();

     // 显示到界面中

     UpdateData(FALSE);

 

     // 关闭socket

     closesocket(socketClient);

 

d)   关闭端口服务

     DWORD dwThread;

     GetExitCodeThread(m_handleSocketServer, &dwThread);

     if (STILL_ACTIVE ==dwThread)

     {

         // 关闭接受消息线程

         TerminateThread(m_handleSocketServer, 0);

         // 关闭服务socket

         closesocket(m_socketServer);

         m_handleSocketServer =NULL;

     }

 

 

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 

 

你可能感兴趣的:(socket)