#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <iostream>
#include <string>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include "stdafx.h"
enum SOCKET_{
SOCKET_CLIENT = 1,
SOCKET_SERVER,
};
class YTSocket{
public:
YTSocket();
~YTSocket();
static YTSocket* GetInstance();
bool InitSocket(SOCKET_ type_,int socket_ip,int socket_port);
bool ListenData();
bool SendMsgToClient(std::string& datas);
bool SendMsgToServer(std::string& datas);
bool StopAll();
bool ListenAllData();
private:
static YTSocket* m_yts;
SOCKET m_socket;
SOCKET m_rec_socket;
SOCKET_ m_socket_type;
int m_listen_state;
};
#include "stdafx.h"
#include "YTSocket.h"
using namespace std;
SOCKET g_m_recsocket = INVALID_SOCKET;
YTSocket* YTSocket::m_yts = NULL;
struct ListenStruct{
SOCKET socket_t;
int socket_state;
};
DWORD WINAPI ListenPort(LPVOID lpParams){
cout << "启动异步监听" << endl;
ListenStruct * m_struct = (ListenStruct*)lpParams;
SOCKET m_socket = m_struct->socket_t;
int type_ = m_struct->socket_state;
if (type_ == 1)
{
if (listen(m_socket,5)== SOCKET_ERROR)
{
cout << "socket 监听失败" << endl;
return false;
}
sockaddr_in remoteAddr;
int len_RemoteAddr = sizeof(remoteAddr);
char recData[255] = {0};
SOCKET m_rec_socket = INVALID_SOCKET;
while(true)
{
m_rec_socket = accept(m_socket,(SOCKADDR*)&remoteAddr,&len_RemoteAddr);
if (m_rec_socket == INVALID_SOCKET)
{
cout << "接收消息无效" << endl;
continue;
}
g_m_recsocket = m_rec_socket;
cout << "接收到一条连接:" << inet_ntoa(remoteAddr.sin_addr) << endl;
int ret = recv(m_rec_socket,recData,1024,0);
if (ret > 0)
{
cout <<"客户端传来的消息为:" <<recData << endl;
}
}
}
else
{
while(true)
{
char recData[1024]={0};
int ret = recv(m_socket,recData,1024,0);
if (ret > 0)
{
cout <<"服务端传来的消息为:" <<recData << endl;
}
}
}
}
YTSocket* YTSocket::GetInstance()
{
if (m_yts == nullptr)
{
m_yts = new YTSocket();
return m_yts;
}
return m_yts;
}
YTSocket::YTSocket()
{
m_socket = INVALID_SOCKET;
m_rec_socket = INVALID_SOCKET;
m_listen_state = 0;
WSADATA wsa_data;
WORD version_ = MAKEWORD(2,2);
int err = WSAStartup(version_,&wsa_data);
if (err == 0)
{
cout << "初始化套接字成功!" << endl;
}
}
YTSocket::~YTSocket(){
cout << "YTSocket被析构了" << endl;
if (m_rec_socket!= INVALID_SOCKET)
{
closesocket(m_rec_socket);
}
if (m_socket!=INVALID_SOCKET)
{
closesocket(m_socket);
}
WSACleanup();
}
bool YTSocket::InitSocket(SOCKET_ type_,int socket_ip,int socket_port)
{
if (type_ == SOCKET_CLIENT)
{
m_socket_type = type_;
}
else if (type_ = SOCKET_SERVER)
{
m_socket_type = type_;
}
else
{
cout << "Socket Type 指定错误" << endl;
return false;
}
if (m_socket_type == SOCKET_SERVER)
{
m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
{
cout << "socket 初始化失败" << endl;
return false;
}
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(socket_port);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(m_socket,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
{
cout << "socket 绑定端口号失败!" << endl;
return false;
}
return true;
}
else{
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(m_socket == INVALID_SOCKET)
{
cout << "socket invalid" << endl;
return false;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(socket_port);
serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if(connect(m_socket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
cout << "连接失败" << endl;
closesocket(m_socket);
return false;
}
return true;
}
return true;
}
bool YTSocket::ListenData()
{
if (m_listen_state == 1)
{
cout << "已经在监听数据,无需重复开启" << endl;
return true;
}
else
{
m_listen_state =1;
}
if (m_socket_type == SOCKET_SERVER)
{
if (listen(m_socket,5)== SOCKET_ERROR)
{
cout << "socket 监听失败" << endl;
return false;
}
sockaddr_in remoteAddr;
int len_RemoteAddr = sizeof(remoteAddr);
char recData[255] = {0};
while(true)
{
m_rec_socket = accept(m_socket,(SOCKADDR*)&remoteAddr,&len_RemoteAddr);
if (m_rec_socket == INVALID_SOCKET)
{
cout << "接收消息无效" << endl;
continue;
}
cout << "接收到一条连接:" << inet_ntoa(remoteAddr.sin_addr) << endl;
int ret = recv(m_rec_socket,recData,1024,0);
if (ret > 0)
{
cout <<"客户端传来的消息为:" <<recData << endl;
}
}
}
else
{
while(true)
{
char recData[1024]={0};
int ret = recv(m_socket,recData,1024,0);
if (ret > 0)
{
cout <<"服务端传来的消息为:" <<recData << endl;
}
}
}
return true;
}
bool YTSocket::ListenAllData()
{
if (m_listen_state == 1)
{
cout << "已经在监听数据,无需重复开启" << endl;
return true;
}
else
{
m_listen_state =1;
}
if (m_socket_type == SOCKET_SERVER)
{
ListenStruct stc;
stc.socket_state = 1;
stc.socket_t = m_socket;
CreateThread(NULL, 0, &ListenPort, &stc, 0, NULL);
return true;
}
else
{
ListenStruct stc;
stc.socket_state = 0;
stc.socket_t = m_socket;
CreateThread(NULL, 0, &ListenPort, &stc, 0, NULL);
return true;
}
}
bool YTSocket::SendMsgToServer(std::string& datas)
{
if (m_socket == INVALID_SOCKET)
{
cout << "socket 连接失败" << endl;
return false;
}
send(m_socket,datas.c_str(),strlen(datas.c_str()),0);
return true;
}
bool YTSocket::SendMsgToClient(std::string& datas)
{
if(m_rec_socket == INVALID_SOCKET)
{
cout << "客户端无效" << endl;
return false;
}
send(m_rec_socket,datas.c_str(),strlen(datas.c_str()),0);
cout << "服务端发送成功" << endl;
return true;
}
bool YTSocket::StopAll()
{
if (m_rec_socket!= INVALID_SOCKET)
{
closesocket(m_rec_socket);
}
if (m_socket!=INVALID_SOCKET)
{
closesocket(m_socket);
}
WSACleanup();
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
YTSocket::GetInstance()->InitSocket(SOCKET_SERVER,1000,8008);
YTSocket::GetInstance()->ListenData();
std::string dtas = "测试数据一下";
YTSocket::GetInstance()->SendMsgToClient(dtas);
system("pause");
return 0;
}
YTSocket::GetInstance()->InitSocket(SOCKET_CLIENT,1000,8008);
string datas = "服务端,你收到了吗?";
YTSocket::GetInstance()->SendMsgToServer(datas);
YTSocket::GetInstance()->SendMsgToServer(datas);
YTSocket::GetInstance()->ListenData();
system("pause");
return 0;
- 运行结果:
- 还有点小bug:
- 1.socket异步处理还有点问题
- 2.ip地址还没加上去 ,做测试使用