mawinkle há 6 anos atrás
pai
commit
9271a993b2
5 ficheiros alterados com 148 adições e 110 exclusões
  1. 1 0
      .gitignore
  2. 19 7
      server.cpp
  3. 13 98
      socketio.hpp
  4. 110 0
      socketio_posix.cpp
  5. 5 5
      test.cpp

+ 1 - 0
.gitignore

@@ -3,3 +3,4 @@
 *.dll
 *.lib
 *.so
+s

+ 19 - 7
server.cpp

@@ -2,21 +2,33 @@
 #include <iostream>
 template<typename T>
 std::ostream& operator<<(std::ostream& out, std::vector<T> o){
-	out << "[";
+	out << "(";
+	/*out << o[0];
+	out << ", ";
+	out << o[1];
+	out << ", ";
+	out << o[2];
+	out << ", ";
+	out << o[3];
+	out << ", ";*/
 	for(int i = 0;i < o.size();i++){
 		out << o[i];
-		if(i < o.size() - 1)
+		if(i < (o.size() - 1))
 			out << ", ";
 	}
-	return out << "]";
+	return out << ")";
 }
+/*template<>
+std::ostream& operator<< <char>(std::ostream& out, std::vector<char> o){
+	for(int i = 0;i < o.size();i++){
+		out << o[i];
+	}
+	return out;
+}*/
 int main(){
-	server_socket ssock(8080);
+	server_socket ssock(80);
 	cppsocket sock = ssock.accept_connection();
-	sock.write("Stringtext");
 	std::vector<char> vec = sock.receive();
 	std::cout << vec << std::endl;
 	sock.write("Message2");
-	vec = sock.receive();
-	std::cout << vec << std::endl;
 }

+ 13 - 98
socketio.hpp

@@ -6,83 +6,23 @@
 #include <cmath>
 #include <stdexcept>
 
-#include <stdio.h> 
-#include <sys/socket.h> 
-#include <stdlib.h> 
-#include <netinet/in.h> 
-#include <string.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-
-struct socket_exception : public std::exception{
-	std::string msg;
-	socket_exception(std::string&& _msg){
-		msg = std::move(_msg);
-	}
-	const char* what() const throw (){
-    	return msg.length() == 0 ? "Connection creation failure" : msg.c_str();
-    }
-};
+#include <sys/socket.h>
+#include <netinet/in.h>
 class cppsocket{
 private:
 	struct sockaddr_in serv_addr;
 	int sock;
 	std::vector<char> buffer;
 public:
-	const static constexpr unsigned int buffersize = 16;
-	cppsocket(sockaddr_in _serv_addr,int _sock) : sock(_sock), serv_addr(_serv_addr){
-		buffer = std::vector<char>(buffersize + 1,0);
-	}
-	cppsocket(){};
-	cppsocket(const std::string& addr, unsigned int PORT){
-		struct sockaddr_in address; 
-		sock = 0;
-		int valread;
-		buffer = std::vector<char>(buffersize + 1, 0);
-		
-		if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
-			printf("\n Socket creation error \n"); 
-		}
-		
-		memset(&serv_addr, '0', sizeof(serv_addr)); 
-		serv_addr.sin_family = AF_INET; 
-		serv_addr.sin_port = htons(PORT);
-		
-		if(inet_pton(AF_INET, addr.c_str(), &serv_addr.sin_addr)<=0){ 
-			throw std::invalid_argument("Invalid address: " + addr);
-		} 
-
-		if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { 
-			throw socket_exception("Could not reach server " + addr);  
-		}
-	}
-	void write(const std::string& message){
-		for(size_t i = 0;i < message.length();i += buffersize){
-			char cs[buffersize + 1] = {0};
-			std::memcpy(cs, message.c_str() + i,buffersize);
-			if((i + buffersize) < message.length()){
-				cs[buffersize] = 'c';
-			}
-			else{
-				cs[buffersize] = (char)0;
-			}
-			send(sock, message.c_str(), message.size(), 0);
-		}
-	}
-	
-	std::vector<char> receive(){
-		std::vector<char> stor;
-		while(true){
-			std::fill(buffer.begin(), buffer.end(), (char)0);
-			size_t val = read(sock, buffer.data(), buffersize + 1);
-			if(val == 0)throw socket_exception("Connection reset by peer");
-			stor.insert(stor.end(),buffer.begin(),buffer.begin() + std::min(val, (size_t)buffersize));
-			if(buffer.data()[buffersize] == (char)0)break;
-		}
-		
-		return std::move(stor);
-	}
+	const static constexpr unsigned int buffersize = 1024;
+	cppsocket(sockaddr_in _serv_addr, int _sock);
+	cppsocket();
+	cppsocket(const std::string& addr, unsigned int PORT);
+	void write(const std::string& message);
+	void write(const std::vector<char>& message);
+	std::vector<char> receive();
 };
+
 class server_socket{
 private:
 	int port_;
@@ -90,34 +30,9 @@ private:
 	struct sockaddr_in address;
 	socklen_t addrlen;
 public:
-	int port(){return port_;}
-	server_socket(int _port) : port_(_port){ 
-		int opt = 1; 
-		addrlen = sizeof(address);
-		if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { 
-			throw socket_exception("server_socket creation failed"); 
-		}
-		if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { 
-			throw socket_exception("server_socket creation failed"); 
-		} 
-		address.sin_family = AF_INET; 
-		address.sin_addr.s_addr = INADDR_ANY; 
-		address.sin_port = htons(port());
-		if(bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0){ 
-			throw socket_exception("Couldn't bind to port " + std::to_string(port()) + ", is it already in use?"); 
-		}
-		if (listen(server_fd, 16) < 0){ 
-			throw socket_exception("Error in listen() call, no clue why"); 
-		}
-	}
-	cppsocket accept_connection(){
-		int new_socket;
-		sockaddr client_addr;
-		if ((new_socket = accept(server_fd, (struct sockaddr *)&client_addr,(socklen_t*)&addrlen))<0){ 
-			throw socket_exception("Socket accept failed"); 
-		}
-		return cppsocket(*((sockaddr_in*)&client_addr), new_socket);
-	}
+	int port();
+	server_socket(int _port);
+	cppsocket accept_connection();
 };
 
 

+ 110 - 0
socketio_posix.cpp

@@ -1 +1,111 @@
 #include "socketio.hpp"
+#include <arpa/inet.h>
+#include <unistd.h>
+struct socket_exception : public std::exception{
+	std::string msg;
+	socket_exception(std::string&& _msg){
+		msg = std::move(_msg);
+	}
+	socket_exception(const std::string& _msg){
+		msg = _msg;
+	}
+	socket_exception(const char* _msg){
+		msg = std::string(_msg);
+	}
+	const char* what() const throw (){
+    	return msg.length() == 0 ? "Connection creation failure" : msg.c_str();
+    }
+};
+cppsocket::cppsocket(sockaddr_in _serv_addr,int _sock) : sock(_sock), serv_addr(_serv_addr){
+	buffer = std::vector<char>(buffersize + 1,0);
+}
+cppsocket::cppsocket(){};
+cppsocket::cppsocket(const std::string& addr, unsigned int PORT){
+	struct sockaddr_in address;
+	sock = 0;
+	int valread;
+	buffer = std::vector<char>(buffersize + 1, 0);
+	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+		throw socket_exception("Socket creation error");
+	}
+	memset(&serv_addr, '0', sizeof(serv_addr));
+	serv_addr.sin_family = AF_INET;
+	serv_addr.sin_port = htons(PORT);
+	if(inet_pton(AF_INET, addr.c_str(), &serv_addr.sin_addr)<=0){
+		throw std::invalid_argument("Invalid address: " + addr);
+	}
+
+	if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
+		throw socket_exception("Could not reach server " + addr);
+	}
+}
+void cppsocket::write(const std::string& message){
+	for(size_t i = 0;i < message.length();i += buffersize){
+		char cs[buffersize + 1] = {0};
+		std::memcpy(cs, message.c_str() + i,buffersize);
+		if((i + buffersize) < message.length()){
+			cs[buffersize] = 'c';
+			send(sock, cs, buffersize + 1, 0);
+		}
+		else{
+			cs[message.length() - buffersize] = (char)0;
+			send(sock, cs, message.length() - i, 0);
+		}
+	}
+}
+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';
+			send(sock, cs, buffersize + 1, 0);
+		}
+		else{
+			cs[message.size() - buffersize] = (char)0;
+			send(sock, cs, message.size() - i, 0);
+		}
+	}
+}
+std::vector<char> cppsocket::receive(){
+	std::vector<char> stor;
+	while(true){
+		std::fill(buffer.begin(), buffer.end(), (char)0);
+		size_t val = read(sock, buffer.data(), buffersize + 1);
+		if(val == 0)throw socket_exception("Connection reset by peer");
+		//std::cout << val << std::endl;
+		stor.insert(stor.end(), buffer.begin(), buffer.begin() + std::min(val, (size_t)buffersize));
+		if(buffer.data()[buffersize] == (char)0)break;
+	}
+	return std::move(stor);
+}
+server_socket::server_socket(int _port) : port_(_port){
+	int opt = 1;
+	addrlen = sizeof(address);
+	if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
+		throw socket_exception("server_socket creation failed");
+	}
+	if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
+		throw socket_exception("server_socket creation failed");
+	}
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr = INADDR_ANY;
+	address.sin_port = htons(port());
+	if(bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0){
+		throw socket_exception("Couldn't bind to port " + std::to_string(port()) + ", is it already in use?"); 
+	}
+	if (listen(server_fd, 16) < 0){
+		throw socket_exception("Error in listen() call, no clue why");
+	}
+}
+cppsocket server_socket::accept_connection(){
+	int new_socket;
+	sockaddr client_addr;
+	if ((new_socket = accept(server_fd, (struct sockaddr *)&client_addr,(socklen_t*)&addrlen))<0){
+		throw socket_exception("Socket accept failed");
+	}
+	return cppsocket(*((sockaddr_in*)&client_addr), new_socket);
+}
+
+int server_socket::port(){return port_;}
+

+ 5 - 5
test.cpp

@@ -3,7 +3,7 @@
 template<typename T>
 std::ostream& operator<<(std::ostream& out, std::vector<T> o){
 	out << "[";
-	for(int i = 0;i < o.size();i++){
+	for(unsigned int i = 0;i < o.size();i++){
 		out << o[i];
 		if(i < o.size() - 1)
 			out << ", ";
@@ -11,12 +11,12 @@ std::ostream& operator<<(std::ostream& out, std::vector<T> o){
 	return out << "]";
 }
 int main(){
-	cppsocket sock("127.0.0.1", 8080);
-	sock.write("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.");
+	cppsocket sock("127.0.0.1", 80);
+	//sock.write("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.");
+	sock.write("sdkjfshdflkjsh");
 	std::vector<char> vec = sock.receive();
 	std::cout << vec << std::endl;
 	vec = sock.receive();
-	sock.write("sdkjflghl");
 	std::cout << vec << std::endl;
 	return 0;
-}
+}