#include "CSockLry.h"
using namespace std;
int CSockLry::SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCSTR sIP, int nFlags)
{
return 0;
}
int CSockLry::ReceiveFrom(void* lpBuf, int nBufLen, LPSTR sIP, UINT* pPort, int nFlags)
{
return 0;
}
BOOL CSockLry::Accept(CSockLry& socka, LPSTR sIP, PUINT pPort)
{
sockaddr_in sa{ AF_INET };
int nLen = sizeof(sa);
socka.m_hSocket = accept(m_hSocket, (sockaddr*)&sa, &nLen);
if (sIP)
InetNtop(AF_INET, &sa.sin_addr, sIP, 16);
if (pPort)
*pPort = htons(sa.sin_port);
return 0;
}
BOOL CSockLry::Connect(LPCSTR lpszHostAddress, UINT nHostPort)
{
sockaddr_in sa{ AF_INET };
InetPton(AF_INET, lpszHostAddress, &sa.sin_addr);
sa.sin_port = htons(nHostPort);
connect(m_hSocket, (sockaddr*)&sa, sizeof(sa));
return 0;
}
BOOL CSockLry::Create(UINT nSocketPort, int nSocketType, LPCSTR sIP)
{
m_hSocket = socket(AF_INET, nSocketType, 0);
if (m_hSocket == INVALID_SOCKET)
{
cout << "句柄创建失败" << endl;
return FALSE;
}
sockaddr_in sa{ AF_INET };
if (sIP)
InetPton(AF_INET, sIP, &sa.sin_addr);
if (nSocketType)
sa.sin_port = htons(nSocketPort);
int n = bind(m_hSocket, (sockaddr*)&sa, sizeof(sa));
if (n)
{
cout << "句柄绑定创建失败" << endl;
return FALSE;
}
return true;
}
BOOL CSockLry::GetSocketName(LPSTR sIP, PUINT pPort)
{
return 0;
}
BOOL CSockLry::GetPeerName(LPSTR sIP, PUINT pPort)
{
sockaddr_in sa{ AF_INET };
int nLen = sizeof(sa);
getpeername(m_hSocket, (sockaddr*)&sa, &nLen);
if (sIP)
InetNtop(AF_INET, &sa.sin_addr, sIP, 16);
if (pPort)
*pPort = sa.sin_port;
return 0;
}
#pragma once
#pragma once
#include <Ws2tcpip.h>
#include <iostream>
#include <WinSock2.h>
class CSockLry
{
SOCKET m_hSocket;
public:
CSockLry() :m_hSocket(INVALID_SOCKET)
{
WSAData wd;
WSAStartup(0x0202, &wd);
}
~CSockLry()
{
if (m_hSocket != INVALID_SOCKET)
closesocket(m_hSocket);
}
static int GetLastError()
{
return WSAGetLastError();
}
int Receive(void* lpBuf, int nBufLen, int nFlags = 0)
{
return recv(m_hSocket, (char*)lpBuf, nBufLen, nFlags);
}
BOOL Listen(int backlog = 5)
{//TCPServer
return 0 == listen(m_hSocket, backlog);
}
int Send(const void* lpBuf, int nBufLen, int nFlags = 0)
{
return send(m_hSocket, (char*)lpBuf, nBufLen, nFlags);//write
}
int SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCSTR sIP, int nFlags = 0);
int ReceiveFrom(void* lpBuf, int nBufLen, LPSTR sIP = nullptr, UINT* pPort = nullptr,
int nFlags = 0);
BOOL Accept(CSockLry& socka, LPSTR sIP = nullptr, PUINT pPort = nullptr); //SERVER
BOOL Connect(LPCSTR lpszHostAddress, UINT nHostPort);//CLIENT
BOOL Create(UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCSTR sIP = nullptr);
BOOL GetSocketName(LPSTR sIP = nullptr, PUINT pPort = nullptr);//本机IP和端口
BOOL GetPeerName(LPSTR sIP = nullptr, PUINT pPort = nullptr);//对方IP和端口
void Close()
{
closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
}
};
#pragma comment(lib,"ws2_32.lib")
#include "CSockLry.h"
#include <process.h>
enum{SERVER_PORT=456};
using namespace std;
void RecvProc(void* p)
{
CSockLry socka = *(CSockLry*)p;
char sText[256],sIp[32];
UINT nPort;
while (true)
{
int n = socka.Receive(sText, sizeof(sText) - 1);
if (n <= 0)
cout << "接收失败" << CSockLry::GetLastError() << endl;
socka.GetPeerName(sIp, &nPort);
sText[n] = '\0';
cout << "数据来源IP: " << sIp << " 端口: " << nPort << "---" << sText << endl;
}
}
int main()
{
CSockLry sock;
if (!sock.Create(SERVER_PORT, SOCK_STREAM))
{
cout << "创建失败" << CSockLry::GetLastError() << endl;
}
sock.Listen();
while (true)
{
CSockLry* pSocka = new CSockLry;
sock.Accept(*pSocka);
_beginthread(RecvProc, 0, pSocka);
}
return 0;
}
#include "CSockLry.h"
enum { SERVER_PORT = 456 };
using namespace std;
int main()
{
CSockLry sock;
sock.Create();
sock.Connect("127.0.0.1", SERVER_PORT);
char sText[256];
while (true)
{
cout << "请输入需要传输的数据: ";
cin >> sText;
sock.Send(sText, strlen(sText));
}
return 0;
}
sock.Create();
sock.Connect(“127.0.0.1”, SERVER_PORT);
char sText[256];
while (true)
{
cout << "请输入需要传输的数据: ";
cin >> sText;
sock.Send(sText, strlen(sText));
}
return 0;
}