#pragma once
|
#ifndef SOCKET_COMM_H
|
#define SOCKET_COMM_H
|
|
#include <winsock2.h>
|
#include <ws2tcpip.h>
|
#include <string>
|
#include <vector>
|
#include <iostream>
|
|
#pragma comment(lib, "ws2_32.lib")
|
|
class SocketComm {
|
public:
|
SocketComm();
|
~SocketComm();
|
|
bool createClientSocket(const std::string& serverIP, uint16_t serverPort); // ¿Í»§¶Ë
|
bool createServerSocket(uint16_t port); // ·þÎñ¶Ë£¨¼àÌý£©
|
|
// ÐÂÔö£º·Ç×èÈû accept/ÊÕ·¢/¹Ø±ÕÖ¸¶¨¿Í»§¶Ë
|
bool acceptOne(SOCKET& outClient, std::string& outIp, uint16_t& outPort);
|
bool recvFrom(SOCKET s, std::vector<uint8_t>& buffer, bool& peerClosed);
|
|
// ¿ÉÑ¡£ºÎªÁ˼æÈݾɵ÷Ó㬱£ÁôÒ»¸öÄÚÁª°ü×°£¨Èç¹ûÆäËüµØ·½»¹Óõ½Á˾ÉÇ©Ãû£©
|
inline bool recvFrom(SOCKET s, std::vector<uint8_t>& buffer) {
|
bool closed = false;
|
return recvFrom(s, buffer, closed);
|
}
|
bool sendTo(SOCKET s, const std::vector<uint8_t>& data);
|
void closeClient(SOCKET s);
|
|
void closeSocket(); // ¹Ø±Õ¼àÌý»òµ¥Á¬½Ó
|
|
// ¹©ÉϲãÅжϱ¾¶ÔÏóµ±Ç°ÊÇ·ñÊÇ¡°¼àÌýģʽ¡±
|
bool isListening() const { return listenSock != INVALID_SOCKET; }
|
bool sendDataSingle(const std::vector<uint8_t>& data); // ¿Í»§¶Ëµ¥Á¬½Ó·¢ËÍ
|
bool recvSingle(std::vector<uint8_t>& buffer); // ¿Í»§¶Ëµ¥Á¬½Ó½ÓÊÕ
|
|
private:
|
SOCKET listenSock = INVALID_SOCKET; // ¼àÌý socket£¨·þÎñ¶Ë£©
|
SOCKET sock = INVALID_SOCKET; // µ¥Á¬½Óģʽ£¨¿Í»§¶ËʱÓã©
|
WSADATA wsaData{};
|
|
bool setNonBlocking(SOCKET s, bool nb);
|
};
|
|
#endif // SOCKET_COMM_H
|