Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <iostream>
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <arpa/inet.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #define MAX_SIZE 1024
- using namespace std;
- bool write_fully(int fd, const char *buffer, ssize_t count) {
- const char *ptr = buffer;
- const char *end = buffer + count;
- while (ptr != end) {
- ssize_t written = write(fd, (void*) ptr, end - ptr);
- if (written == -1) {
- return false;
- }
- ptr += written;
- }
- return true;
- }
- void server_for_connection(int socket_fd) {
- int read_count;
- char request_buf[MAX_SIZE];
- while (1) {
- read_count = read(socket_fd, (void*) request_buf, MAX_SIZE);
- if (read_count == 0) {
- return; // EOF
- } else if (read_count == -1) {
- cerr << "read: " << strerror(errno) << endl;
- return;
- }
- string response = string(request_buf, read_count);
- cout << "read: " << response;
- if (response.substr(0,4).find("USER") != string::npos) {
- string acceptedUser = "230 Welcome!!!\n";
- const char* acceptedCstr = acceptedUser.c_str();
- send(socket_fd, acceptedCstr, strlen(acceptedCstr), 0);
- }
- if (false == write_fully(socket_fd, request_buf, read_count)) {
- cerr << "write: " << strerror(errno) << endl;
- return;
- }
- }
- }
- int main(int argc, char** argv) {
- if (argc < 2) {
- std::cerr << "Usage: " << argv[0] << " PORT-NUMBER" << std::endl;
- return 1;
- }
- const char *portname = argv[1];
- string stringMsg = "220 Please reply.\n";
- const char* exampleMsg = stringMsg.c_str();
- socklen_t socksize = sizeof(struct sockaddr_in);
- struct sockaddr_in addr_dest;
- struct sockaddr_in addr;
- addr.sin_family = AF_INET;
- inet_pton(AF_INET, "127.0.0.1", &(addr.sin_addr.s_addr));
- // addr.sin_addr.s_addr = INADDR_ANY;
- addr.sin_port = htons(atoi(portname));
- int server_socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (bind(server_socket_fd, (struct sockaddr*) &addr, sizeof(addr)) < 0) {
- cout << "Error with binding!!!" << endl;
- return 1;
- }
- listen(server_socket_fd, 1);
- int client_socket_fd = accept(server_socket_fd, (struct sockaddr*) &addr_dest, &socksize);
- while(client_socket_fd) {
- printf("Connection from: %s\n", inet_ntoa(addr.sin_addr));
- send(client_socket_fd, exampleMsg, strlen(exampleMsg), 0);
- server_for_connection(client_socket_fd);
- close(client_socket_fd);
- client_socket_fd = accept(server_socket_fd, (struct sockaddr*) &addr_dest, &socksize);
- }
- close(server_socket_fd);
- // std::cout << "Code to bind to 127.0.0.1 port " << portname
- // << " and listen for connections unimplemented." << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement