套接字Socket

TCP/IPTransmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。UDPUser Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。套接字Socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

套接字Socket

 

套接字Socket

与Socket相关的网络编程服务器端实现

#include <iostream>

#include <Windows.h> 

using namespace std; 

#define  PORT 4000

#define  IP_ADDRESS "127.0.0.1"



DWORD WINAPI ClientThread(LPVOID lpParameter)

{

     SOCKET CientSocket = (SOCKET)lpParameter;

     int Ret = 0;

    char RecvBuffer[MAX_PATH];

	

      while ( true )

      {

          memset(RecvBuffer, 0x00, sizeof(RecvBuffer));

          Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);

          if ( Ret == 0 || Ret == SOCKET_ERROR ) 

          {

             cout<<"客户端退出!"<<endl;

              break;

          }

          cout<<"接收到客户信息为:"<<RecvBuffer<<endl;

      }

 

      return 0;

  }

  

int main(int argc, char* argv[])

{

     WSADATA  Ws;

     SOCKET ServerSocket, CientSocket;

     struct sockaddr_in LocalAddr, ClientAddr;	 	 

	 int Ret = 0;

	 int AddrLen = 0;

	 HANDLE hThread = NULL;



     //Init Windows Socket

     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )

	 {

       cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;

         return -1;    }

    //Create Socket    

	 ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

     if (ServerSocket == INVALID_SOCKET )

     {

         cout<<"Create Socket Failed::"<<GetLastError()<<endl;

          return -1;

     }

  

      LocalAddr.sin_family = AF_INET;

      LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);

      LocalAddr.sin_port = htons(PORT);

      memset(LocalAddr.sin_zero, 0x00, 8);

  

      //Bind Socket

      Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));

      if ( Ret != 0 )

      {

          cout<<"Bind Socket Failed::"<<GetLastError()<<endl;

          return -1;

      }

  

      Ret = listen(ServerSocket, 10);

      if ( Ret != 0 )

      {

          cout<<"listen Socket Failed::"<<GetLastError()<<endl;

          return -1;

      }

  

      cout<<"服务端已经启动"<<endl;

  

      while ( true )

      {

          AddrLen = sizeof(ClientAddr);

          CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);

          if ( CientSocket == INVALID_SOCKET )

          {

              cout<<"Accept Failed::"<<GetLastError()<<endl;

              break;

          }

  

          cout<<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;

          

          hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);

          if ( hThread == NULL )

          {

              cout<<"Create Thread Failed!"<<endl;

              break;

          }

  

          CloseHandle(hThread);

      }  

      closesocket(ServerSocket);

      closesocket(CientSocket);

      WSACleanup(); 

      return 0;

} 

  客户端实现:

 
 //Client.cpp

  #include <iostream>

  #include <Windows.h>

  

  using namespace std;

  

  #define  PORT 4000

  #define  IP_ADDRESS "127.0.0.1"

  

 

 int main(int argc, char* argv[])

 {

     WSADATA  Ws;

     SOCKET CientSocket;

     struct sockaddr_in ServerAddr;

     int Ret = 0;

     int AddrLen = 0;

     HANDLE hThread = NULL;

     char SendBuffer[MAX_PATH];



     //Init Windows Socket

     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )

     {

         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;

         return -1;

     }

 

     //Create Socket

     CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

     if ( CientSocket == INVALID_SOCKET )

     {

         cout<<"Create Socket Failed::"<<GetLastError()<<endl;

         return -1;

     }

 

     ServerAddr.sin_family = AF_INET;

     ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);

     ServerAddr.sin_port = htons(PORT);

     memset(ServerAddr.sin_zero, 0x00, 8);

 

     Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));

     if ( Ret == SOCKET_ERROR )

     {

         cout<<"Connect Error::"<<GetLastError()<<endl;

         return -1;

     }

     else

     {

         cout<<"连接成功!"<<endl;

     }

 

     while ( true )

     {

         cin.getline(SendBuffer, sizeof(SendBuffer));

         Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);

         if ( Ret == SOCKET_ERROR )

         {

             cout<<"Send Info Error::"<<GetLastError()<<endl;

             break;

         }

     }

     

     closesocket(CientSocket);

     WSACleanup();

 

     return 0;

 }

  

  

 

 

 

 

 

 

你可能感兴趣的:(socket)