Przeglądaj źródła

Complete _WIN32 support

manuel5975p 6 lat temu
rodzic
commit
92d651b322
4 zmienionych plików z 143 dodań i 153 usunięć
  1. BIN
      a.exe
  2. 23 1
      socketio.hpp
  3. 118 149
      socketio_win32.cpp
  4. 2 3
      test.cpp

BIN
a.exe


+ 23 - 1
socketio.hpp

@@ -7,17 +7,32 @@
 #include <exception>
 #include <cmath>
 #include <stdexcept>
-
+#ifndef _WIN32
 #include <sys/socket.h>
 #include <netinet/in.h>
+#else
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#pragma comment(lib, "ws2_32.lib")
+#endif
 class cppsocket{
 private:
+#ifdef _WIN32
+	WSADATA wsa;
+	SOCKET s;
+	std::vector<char> buffer;
+#else
 	struct sockaddr_in serv_addr;
 	int sock;
 	std::vector<char> buffer;
+#endif
 public:
 	const static std::size_t buffersize = 256;
+#ifdef _WIN32
+	cppsocket(WSADATA d, SOCKET _s);
+#else
 	cppsocket(sockaddr_in _serv_addr, int _sock);
+#endif
 	cppsocket();
 	cppsocket(const std::string& addr, unsigned int PORT);
 	void close();
@@ -29,14 +44,21 @@ public:
 
 class server_socket{
 private:
+#ifdef _WIN32
+	WSADATA wsaData;
+	int iResult;
+	SOCKET ListenSocket = INVALID_SOCKET;
+#else
 	int port_;
 	int server_fd;
 	struct sockaddr_in address;
 	socklen_t addrlen;
+#endif
 public:
 	int port();
 	server_socket(int _port);
 	cppsocket accept_connection();
+	void close();
 };
 #endif
 

+ 118 - 149
socketio_win32.cpp

@@ -2,11 +2,12 @@
 #include <stdio.h>
 #include <winsock2.h>
 #include <ws2tcpip.h>
+#pragma comment(lib, "ws2_32.lib")
 #include <string>
 #include <cstring>
 #include <vector>
 #include <iostream>
-#pragma comment(lib, "ws2_32.lib")
+
 using std::size_t;
 struct socket_exception : public std::exception{
 	std::string msg;
@@ -24,27 +25,8 @@ struct socket_exception : public std::exception{
     	return msg.length() == 0 ? "Connection creation failure" : msg.c_str();
     }
 };
-template<typename T>
-std::ostream& operator<<(std::ostream& out, std::vector<T> o){
-	out << "[";
-	for(unsigned int i = 0;i < o.size();i++){
-		if(o[i] == '\r')continue;
-		out << o[i];
-		if(i < o.size() - 1)
-			out << ", ";
-	}
-	return out << "]";
-}
-template<>
-std::ostream& operator<< <char>(std::ostream& out, std::vector<char> o){
-	for(unsigned int i = 0;i < o.size();i++){
-		if(o[i])
-		out << o[i];
-	}
-	return out;
-}
-std::string GetLastErrorAsString()
-{
+
+std::string GetLastErrorAsString(){
     //Get the error message, if any.
     DWORD errorMessageID = ::GetLastError();
     if(errorMessageID == 0)
@@ -62,144 +44,131 @@ std::string GetLastErrorAsString()
     return message;
 }
 
-class cppsocket{
-	private:
-	WSADATA wsa;
-	SOCKET s;
-	std::vector<char> buffer;
-	public:
-	static const int buffersize = 1024;
-	cppsocket(WSADATA d, SOCKET _s){
-		s = _s;
-		wsa = d;
-		buffer = std::vector<char>(buffersize);
-	}
-	cppsocket(const std::string& addr, unsigned short PORT){
-		struct sockaddr_in server;
-		buffer = std::vector<char>(buffersize);
-		int recv_size;
-		
-		if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
-			throw socket_exception(std::string("Socket creation error: ") + GetLastErrorAsString());
-		}
-		
-		if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
-			throw socket_exception(std::string("Socket creation error: ") + GetLastErrorAsString());
-		}
-		
-		server.sin_addr.s_addr = inet_addr(addr.c_str());
-		server.sin_family = AF_INET;
-		server.sin_port = htons(PORT);
+cppsocket::cppsocket(){}
+cppsocket::cppsocket(WSADATA d, SOCKET _s){
+	s = _s;
+	wsa = d;
+	buffer = std::vector<char>(buffersize);
+}
+cppsocket::cppsocket(const std::string& addr, unsigned int PORT){
+	struct sockaddr_in server;
+	buffer = std::vector<char>(buffersize);
+	int recv_size;
+	
+	if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
+		throw socket_exception(std::string("Socket creation error: ") + GetLastErrorAsString());
+	}
+	
+	if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
+		throw socket_exception(std::string("Socket creation error: ") + GetLastErrorAsString());
+	}
+	
+	server.sin_addr.s_addr = inet_addr(addr.c_str());
+	server.sin_family = AF_INET;
+	server.sin_port = htons(PORT);
 
-		if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0){
-			throw socket_exception(std::string("Could not connect to host: ") + GetLastErrorAsString());
-		}
+	if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0){
+		throw socket_exception(std::string("Could not connect to host: ") + GetLastErrorAsString());
 	}
-	void write(const std::string& message){
-		std::vector<char> msg(message.c_str(), message.c_str() + message.size());
-		write(msg);
-	}
-	void write(const std::vector<char>& message){
-		for(size_t i = 0;i < message.size();i += buffersize){
-			char cs[buffersize + 1] = {0};
-			std::memcpy(cs, message.data() + i,buffersize);
-			if((i + buffersize) < message.size()){
-				cs[buffersize] = 'c';
-				if(send(s, cs, buffersize + 1, 0) < 0){
-					throw socket_exception(std::string("Couldn't write to peer: ") + GetLastErrorAsString());
-				}
+}
+void cppsocket::write(const std::string& message){
+	std::vector<char> msg(message.c_str(), message.c_str() + message.size());
+	write(msg);
+}
+void cppsocket::write(const std::vector<char>& message){
+	for(size_t i = 0;i < message.size();i += buffersize){
+		char cs[buffersize + 1] = {0};
+		std::memcpy(cs, message.data() + i,buffersize);
+		if((i + buffersize) < message.size()){
+			cs[buffersize] = 'c';
+			if(send(s, cs, buffersize + 1, 0) < 0){
+				throw socket_exception(std::string("Couldn't write to peer: ") + GetLastErrorAsString());
 			}
-			else{
-				cs[message.size() - i] = (char)0;
-				if(send(s, cs, message.size() - i, 0) < 0){
-					throw socket_exception(std::string("Couldn't write to peer: ") + GetLastErrorAsString());
-				}
+		}
+		else{
+			cs[message.size() - i] = (char)0;
+			if(send(s, cs, message.size() - i, 0) < 0){
+				throw socket_exception(std::string("Couldn't write to peer: ") + GetLastErrorAsString());
 			}
 		}
 	}
-	std::vector<char>receive(){
-		std::vector<char> stor;
-		while(true){
-			std::fill(buffer.begin(), buffer.end(), (char)0);
-			ssize_t val = recv(s, buffer.data(), buffersize + 1,0);
-			if(val == 0)throw socket_exception("Connection closed by peer");
-			if(val < 0){
-				throw socket_exception(GetLastErrorAsString());
-			}
-			stor.insert(stor.end(), buffer.begin(), buffer.begin() + std::min(val, (ssize_t)buffersize));
-			if(buffer.data()[buffersize] == (char)0){break;}
+}
+std::vector<char> cppsocket::receive(){
+	std::vector<char> stor;
+	while(true){
+		std::fill(buffer.begin(), buffer.end(), (char)0);
+		ssize_t val = recv(s, buffer.data(), buffersize + 1,0);
+		if(val == 0)throw socket_exception("Connection closed by peer");
+		if(val < 0){
+			throw socket_exception(GetLastErrorAsString());
 		}
-		std::cout << std::endl;
-		return stor;
+		stor.insert(stor.end(), buffer.begin(), buffer.begin() + std::min(val, (ssize_t)buffersize));
+		if(buffer.data()[buffersize] == (char)0){break;}
+	}
+	std::cout << std::endl;
+	return stor;
+}
+void cppsocket::close(){
+	closesocket(s);
+}
+
+server_socket::server_socket(int port){
+	struct addrinfo *result = NULL;
+	struct addrinfo hints;
+	iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
+	if (iResult != 0) {
+		printf("WSAStartup failed with error: %d\n", iResult);
+	}
+	ZeroMemory(&hints, sizeof(hints));
+	hints.ai_family = AF_INET;
+	hints.ai_socktype = SOCK_STREAM;
+	hints.ai_protocol = IPPROTO_TCP;
+	hints.ai_flags = AI_PASSIVE;
+
+	// Resolve the server address and port
+	iResult = getaddrinfo(NULL, std::to_string(port).c_str(), &hints, &result);
+	if ( iResult != 0 ) {
+		printf("getaddrinfo failed with error: %d\n", iResult);
+		WSACleanup();
 	}
-	void close(){
-		closesocket(s);
+
+	// Create a SOCKET for connecting to server
+	ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
+	if (ListenSocket == INVALID_SOCKET) {
+		printf("socket failed with error: %ld\n", WSAGetLastError());
+		freeaddrinfo(result);
+		WSACleanup();
 	}
-};
-class server_socket{
-private:
-	WSADATA wsaData;
-	int iResult;
-	SOCKET ListenSocket = INVALID_SOCKET;
-public:
-	server_socket(int port){
-		struct addrinfo *result = NULL;
-		struct addrinfo hints;
-		iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
-		if (iResult != 0) {
-			printf("WSAStartup failed with error: %d\n", iResult);
-		}
-		ZeroMemory(&hints, sizeof(hints));
-		hints.ai_family = AF_INET;
-		hints.ai_socktype = SOCK_STREAM;
-		hints.ai_protocol = IPPROTO_TCP;
-		hints.ai_flags = AI_PASSIVE;
-	
-		// Resolve the server address and port
-		iResult = getaddrinfo(NULL, std::to_string(port).c_str(), &hints, &result);
-		if ( iResult != 0 ) {
-			printf("getaddrinfo failed with error: %d\n", iResult);
-			WSACleanup();
-		}
-	
-		// Create a SOCKET for connecting to server
-		ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
-		if (ListenSocket == INVALID_SOCKET) {
-			printf("socket failed with error: %ld\n", WSAGetLastError());
-			freeaddrinfo(result);
-			WSACleanup();
-		}
-	
-		// Setup the TCP listening socket
-		iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
-		if (iResult == SOCKET_ERROR) {
-			printf("bind failed with error: %d\n", WSAGetLastError());
-			freeaddrinfo(result);
-			closesocket(ListenSocket);
-			WSACleanup();
-		}
+
+	// Setup the TCP listening socket
+	iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
+	if (iResult == SOCKET_ERROR) {
+		printf("bind failed with error: %d\n", WSAGetLastError());
 		freeaddrinfo(result);
-		iResult = listen(ListenSocket, SOMAXCONN);
-		if (iResult == SOCKET_ERROR) {
-			printf("listen failed with error: %d\n", WSAGetLastError());
-			closesocket(ListenSocket);
-			WSACleanup();
-		}
+		closesocket(ListenSocket);
+		WSACleanup();
 	}
-	cppsocket accept_connection(){
-		SOCKET ClientSocket = accept(ListenSocket, NULL, NULL);
-		if (ClientSocket == INVALID_SOCKET) {
-			printf("accept failed with error: %d\n", WSAGetLastError());
-			closesocket(ListenSocket);
-			WSACleanup();
-		}
-		return cppsocket(wsaData, ClientSocket);
+	freeaddrinfo(result);
+	iResult = listen(ListenSocket, SOMAXCONN);
+	if (iResult == SOCKET_ERROR) {
+		printf("listen failed with error: %d\n", WSAGetLastError());
+		closesocket(ListenSocket);
+		WSACleanup();
 	}
-	void close(){
+}
+cppsocket server_socket::accept_connection(){
+	SOCKET ClientSocket = accept(ListenSocket, NULL, NULL);
+	if (ClientSocket == INVALID_SOCKET) {
+		printf("accept failed with error: %d\n", WSAGetLastError());
 		closesocket(ListenSocket);
+		WSACleanup();
 	}
-};
-int main(int argc, char** argv){
+	return cppsocket(wsaData, ClientSocket);
+}
+void server_socket::close(){
+	closesocket(ListenSocket);
+}
+/*int main(int argc, char** argv){
 	server_socket ssock(80);
 	while(true){
 		cppsocket sock = ssock.accept_connection();
@@ -210,7 +179,7 @@ int main(int argc, char** argv){
 		sock.close();
 	}
 	ssock.close();
-	/*
+	
 	//Send some data
 	std::string _message = std::string("Hallo");
 	memcpy(message, _message.c_str(), _message.length() + 1);
@@ -230,6 +199,6 @@ int main(int argc, char** argv){
 	//Add a NULL terminating character to make it a proper string before printing
 	server_reply[recv_size] = '\0';
 	puts(server_reply);
-	*/
+	
 	return 0;
-}
+}*/

+ 2 - 3
test.cpp

@@ -1,6 +1,5 @@
 #include "socketio.hpp"
 #include <iostream>
-#include <thread>
 #include <chrono>
 template<typename T>
 std::ostream& operator<<(std::ostream& out, std::vector<T> o){
@@ -21,8 +20,8 @@ std::ostream& operator<< <char>(std::ostream& out, std::vector<char> o){
 	return out;
 }
 int main(){
-	//cppsocket sock("192.168.178.79", 80);
-	cppsocket sock("127.0.0.1", 80);
+	cppsocket sock("192.168.178.79", 80);
+	//cppsocket sock("127.0.0.1", 80);
 	std::vector<char> toSend(10000);
 	for(unsigned int i = 0;i < toSend.size();i++){
 		toSend[i] = (char)(i * i) % 10 + 'a';