socketClient

来源:互联网 发布:思途cms源码 编辑:程序博客网 时间:2024/06/04 00:23

// client.cpp

#include <iostream>
#include <cstdio>
#include <Winsock2.h>
#include <list>
#include <string>
using namespace std;

list<string> str_a;
list<string> str_b;
list<string> str_c;

HANDLE Lock(LPCWSTR name)
{
       HANDLE mutex;
       // Try to open an exist mutex firstly.
       mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, name);
       if(NULL == mutex)     // If the mutex does not exist, create it with the certain name.
       {
              mutex = CreateMutex(NULL, TRUE, name);
       }
       else // If the mutex already exist, wait for other thread release it.
       {
              WaitForSingleObject(mutex, INFINITE);
       }
       return mutex;
}

bool Unlock(HANDLE mutex)
{
       if(0 == ReleaseMutex(mutex))   // Failed to release mutex
       {
              return false;
       }
       else // Successed in release mutex
       {
              CloseHandle(mutex);
              mutex = NULL;
              return true;
       }
}

DWORD WINAPI ClientThread(LPVOID lpParameter)
{
     SOCKET CientSocket = (SOCKET)lpParameter;
     char recvBuf[1000];

     while ( true )
     {
         memset(recvBuf, 0x00, sizeof(recvBuf));
         recv(CientSocket, recvBuf, sizeof(recvBuf), 0);
         //printf("%s\n", recvBuf);
        HANDLE mutex_a, mutex_b, mutex_c;

        mutex_a = Lock(L"mutex");
        str_a.push_back(string(recvBuf));
        Unlock(mutex_a);

        mutex_b = Lock(L"mutex");
        str_b.push_back(string(recvBuf));
        Unlock(mutex_b);

        mutex_c = Lock(L"mutex");
        str_c.push_back(string(recvBuf));
        Unlock(mutex_c);
     }

     return 0;
}

DWORD WINAPI AProccess(LPVOID lpParameter)
{
    while(true)
    {
        HANDLE mutex = Lock(L"mutex");
        if (!str_a.empty())
        {
            string str = str_a.front();
            str_a.pop_front();
            printf("A: %s\n", str.c_str());
        }
        Unlock(mutex);
    }

}

DWORD WINAPI BProccess(LPVOID lpParameter)
{
    while(true)
    {
        HANDLE mutex = Lock(L"mutex");
        if (!str_b.empty())
        {
            string str = str_b.front();
            str_b.pop_front();
            printf("B: %s\n", str.c_str());
        }
        Unlock(mutex);
    }
}

DWORD WINAPI CProccess(LPVOID lpParameter)
{
    while(true)
    {
        HANDLE mutex = Lock(L"mutex");
        if (!str_c.empty())
        {
            string str = str_c.front();
            str_c.pop_front();
            printf("C: %s\n", str.c_str());
        }
        Unlock(mutex);
    }
}

int main()
{
// 加载socket动态链接库(dll)
    WORD wVersionRequested;
    WSADATA wsaData; // 这结构是用于接收Wjndows Socket的结构信息的
    int err;

    wVersionRequested = MAKEWORD( 1, 1 ); // 请求1.1版本的WinSock库

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        return -1;   // 返回值为零的时候是表示成功申请WSAStartup
    }

    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {
        // 检查这个低字节是不是1,高字节是不是1以确定是否我们所请求的1.1版本
        // 否则的话,调用WSACleanup()清除信息,结束函数
        WSACleanup( );
        return -1;
    }

// 创建socket操作,建立流式套接字,返回套接字号sockClient
    // SOCKET socket(int af, int type, int protocol);
    // 第一个参数,指定地址簇(TCP/IP只能是AF_INET,也可写成PF_INET)
    // 第二个,选择套接字的类型(流式套接字),第三个,特定地址家族相关协议(0为自动)
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);

// 将套接字sockClient与远程主机相连
    // int connect( SOCKET s,  const struct sockaddr* name,  int namelen);
    // 第一个参数:需要进行连接操作的套接字
    // 第二个参数:设定所需要连接的地址信息
    // 第三个参数:地址的长度
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");  // 本地回路地址是127.0.0.1;
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(8000);
    connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

    HANDLE hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)sockClient, 0, NULL);

    HANDLE hThread_a = CreateThread(NULL, 0, AProccess, (LPVOID)NULL, 0, NULL);

    HANDLE hThread_b = CreateThread(NULL, 0, BProccess, (LPVOID)NULL, 0, NULL);

    HANDLE hThread_c = CreateThread(NULL, 0, CProccess, (LPVOID)NULL, 0, NULL);

    while(true);

    printf("End linking...\n");
    closesocket(sockClient);
    WSACleanup(); // 终止对套接字库的使用

    printf("\n");
    system("pause");
    return 0;
}

 

 

 

 

0 0
原创粉丝点击