Kaynağa Gözat

Move constructor posix

mawinkle 6 yıl önce
ebeveyn
işleme
a4e1356d80
3 değiştirilmiş dosya ile 79 ekleme ve 4 silme
  1. 63 0
      server.c
  2. 4 2
      socketio.hpp
  3. 12 2
      socketio_posix.cpp

+ 63 - 0
server.c

@@ -0,0 +1,63 @@
+
+// Server side C/C++ program to demonstrate Socket programming 
+#include <unistd.h> 
+#include <stdio.h> 
+#include <sys/socket.h> 
+#include <stdlib.h> 
+#include <netinet/in.h> 
+#include <string.h> 
+#define PORT 8080 
+int main(int argc, char const *argv[]) 
+{ 
+    int server_fd, new_socket, valread; 
+    struct sockaddr_in address; 
+    int opt = 1; 
+    int addrlen = sizeof(address); 
+    char buffer[1024] = {0}; 
+    char *hello = "Hello from serve"; 
+       
+    // Creating socket file descriptor 
+    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { 
+        perror("socket failed"); 
+        exit(EXIT_FAILURE); 
+    } 
+       
+    // Forcefully attaching socket to the port 8080 
+    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, 
+                                                  &opt, sizeof(opt))) 
+    { 
+        perror("setsockopt"); 
+        exit(EXIT_FAILURE); 
+    } 
+    address.sin_family = AF_INET; 
+    address.sin_addr.s_addr = INADDR_ANY; 
+    address.sin_port = htons( PORT ); 
+       
+    // Forcefully attaching socket to the port 8080 
+    if (bind(server_fd, (struct sockaddr *)&address,  
+                                 sizeof(address))<0) 
+    { 
+        perror("bind failed"); 
+        exit(EXIT_FAILURE); 
+    } 
+    if (listen(server_fd, 3) < 0)
+    { 
+        perror("listen"); 
+        exit(EXIT_FAILURE); 
+    } 
+    if ((new_socket = accept(server_fd, (struct sockaddr *)&address,  
+                       (socklen_t*)&addrlen))<0) 
+    { 
+        perror("accept"); 
+        exit(EXIT_FAILURE); 
+    } 
+    valread = read(new_socket, buffer, 1025); 
+    printf("%s\n", buffer);
+    send(new_socket, "Hello from serve_r Hello", strlen("Hello from serve_r Hello"), 0); 
+	
+    printf("Hello message sent\n");
+	for(unsigned long long i = 0;i < 1e9;i++){
+		if(((i * i) % 3) == 2)return 6;
+	}	
+    return 0; 
+} 

+ 4 - 2
socketio.hpp

@@ -20,12 +20,11 @@ private:
 #ifdef _WIN32
 	WSADATA wsa;
 	SOCKET s;
-	std::vector<char> buffer;
 #else
 	struct sockaddr_in serv_addr;
 	int sock;
-	std::vector<char> buffer;
 #endif
+	std::vector<char> buffer;
 public:
 	const static std::size_t buffersize = 256;
 #ifdef _WIN32
@@ -34,12 +33,15 @@ public:
 	cppsocket(sockaddr_in _serv_addr, int _sock);
 #endif
 	cppsocket();
+	cppsocket(const cppsocket& o) = delete;
+	cppsocket(cppsocket&& o);
 	cppsocket(const std::string& addr, unsigned int PORT);
 	void close();
 	int socket_id();
 	void write(const std::string& message);
 	void write(const std::vector<char>& message);
 	std::vector<char> receive();
+	cppsocket& operator=(cppsocket&& o);
 };
 
 class server_socket{

+ 12 - 2
socketio_posix.cpp

@@ -41,6 +41,12 @@ cppsocket::cppsocket(const std::string& addr, unsigned int PORT){
 		throw socket_exception("Could not reach server " + addr);
 	}
 }
+
+cppsocket::cppsocket(cppsocket&& o){
+	sock = o.sock;
+	o.sock = 0;
+	buffer = std::move(o.buffer);
+}
 int cppsocket::socket_id(){
 	return sock;
 }
@@ -121,7 +127,7 @@ server_socket::server_socket(int _port) : port_(_port){
 	}
 }
 void server_socket::close(){
-	
+	shutdown(server_fd);
 }
 cppsocket server_socket::accept_connection(){
 	int new_socket;
@@ -133,4 +139,8 @@ cppsocket server_socket::accept_connection(){
 }
 
 int server_socket::port(){return port_;}
-
+cppsocket& operator=(cppsocket&& o){
+	sock = o.sock;
+	o.sock = 0;
+	buffer = std::move(o.buffer);
+}