套接字Socket

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

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在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;
 }

  

  

 

 

 

 

 

 

posted @ 2013-10-30 20:31  super 86  阅读(278)  评论(0编辑  收藏  举报