socket客户端服务器通信(多线程)

 //Server.cpp
  #include <iostream>
  #include <winsock2.h>
  #include <stdio.h>
  #include <windows.h>
  #pragma comment(lib,"ws2_32.lib")
  
  using namespace std;
  
  #define  PORT 8882
  #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 <winsock2.h>
  #include <stdio.h>
  #include <windows.h>
  #pragma comment(lib,"ws2_32.lib")
  
  using namespace std;
  
  #define  PORT 8882
  #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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值