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;
}
- SocketClient
- socketClient
- Unity SocketClient
- c# 客户端 SocketClient
- Android环境下使用SocketClient
- SocketClient使用https请求连接
- Android 中SocketClient client = new SocketClient("IP_ADDRESS",8000)出错
- Java, C++同时实现SocketClient功能 程序比较
- 当SocketServer断开或发生Wifi网络变化的时候,SocketClient应该如何处理异常。
- 高精度对数函数的实现
- Nginx源码安装
- 数据仓库之拉链算法
- Linux-用户和用户组管理
- 123
- socketClient
- next_day函数用法
- 高效Redis Client多线程操作的并发吞吐设计
- maven基础教程(二)
- 第十三周项目三 分数类中的运算符重载 (3)
- Ruby hello world
- 349. Intersection of Two Arrays
- Unity3D-基础小知识(一)
- 记一场涨分的Bstar