Ver código fonte

Unable to resolve fuking bug

mawinkle 6 anos atrás
pai
commit
fa6b92b06e
4 arquivos alterados com 64 adições e 41 exclusões
  1. 19 7
      server.cpp
  2. 4 5
      socketio.hpp
  3. 36 24
      socketio_posix.cpp
  4. 5 5
      test.cpp

+ 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;
 }

+ 4 - 5
socketio.hpp

@@ -6,9 +6,7 @@
 #include <cmath>
 #include <stdexcept>
 
-#include <stdio.h> 
-#include <sys/socket.h> 
-#include <stdlib.h> 
+#include <sys/socket.h>
 #include <netinet/in.h>
 class cppsocket{
 private:
@@ -16,11 +14,12 @@ private:
 	int sock;
 	std::vector<char> buffer;
 public:
-	const static constexpr unsigned int buffersize = 16;
-	cppsocket(sockaddr_in _serv_addr,int _sock);
+	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();
 };
 

+ 36 - 24
socketio_posix.cpp

@@ -1,5 +1,4 @@
 #include "socketio.hpp"
-#include <string.h>
 #include <arpa/inet.h>
 #include <unistd.h>
 struct socket_exception : public std::exception{
@@ -22,19 +21,17 @@ cppsocket::cppsocket(sockaddr_in _serv_addr,int _sock) : sock(_sock), serv_addr(
 }
 cppsocket::cppsocket(){};
 cppsocket::cppsocket(const std::string& addr, unsigned int PORT){
-	struct sockaddr_in address; 
+	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");
+		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){ 
+	if(inet_pton(AF_INET, addr.c_str(), &serv_addr.sin_addr)<=0){
 		throw std::invalid_argument("Invalid address: " + addr);
 	}
 
@@ -48,11 +45,26 @@ void cppsocket::write(const std::string& message){
 		std::memcpy(cs, message.c_str() + i,buffersize);
 		if((i + buffersize) < message.length()){
 			cs[buffersize] = 'c';
+			send(sock, cs, buffersize + 1, 0);
 		}
 		else{
-			cs[buffersize] = (char)0;
+			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);
 		}
-		send(sock, message.c_str(), message.size(), 0);
 	}
 }
 std::vector<char> cppsocket::receive(){
@@ -61,36 +73,36 @@ std::vector<char> cppsocket::receive(){
 		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));
+		//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; 
+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 ((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");
 	}
-	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_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){ 
+	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"); 
+	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"); 
+	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);
 }

+ 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;
-}
+}