Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.programming.threads > #6922

Sum server [Swift]

Newsgroups comp.programming.threads
From Branimir Maksimovic <branimir.maksimovic@icloud.com>
Subject Sum server [Swift]
Message-ID <icn6J.5878$2m1.2082@fx26.iad> (permalink)
Organization usenet-news.net
Date 2021-10-03 19:07 +0000

Show all headers | View raw


import Foundation

let s = Server();
s.start()
var semaphore = 4
class Server {
  init() {
    if (CommandLine.argc > 1) {
      tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
      if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
    }
  }
  var ende = false
  var tmpSvcPort: Int = 0
  var servicePort = "1234"
  class Worker:Thread{
    weak var parent: Server! = nil
    init(_ fd:Int32){
      self.fd = fd
    }
    deinit {
        semaphore += 1
        close(fd)
    }
    override func main(){
      let MTU = 65536
      let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
      defer {
         buffer.deallocate()
      }
      var count = 1
       while (count > 0) {
         count -= 1
        let readResult = read(fd, buffer, MTU)

        if (readResult == 0) {
          break;  // end of file
        } else if (readResult == -1) {
          print("Error reading form client\(fd) - \(errno)")
          break;  // error
        } else {
          let strResult =
              String(cString: buffer)
          let numbers = strResult.components(separatedBy: " ")
          var sum = 0
          if numbers.count > 1 {
            if numbers[0].lowercased() == "quit" {
              parent.ende = true
              continue
            } else {
              let num1 = Int(numbers[0]) ?? 0
              let num2 = Int(numbers[1]) ?? 0
              sum = num1 + num2
            }
          }
          print("Received form client(\(fd)): \(strResult)")
          let out = String(format:"suma %d\n",sum)
          let _ = out.withCString {
            write(fd, $0, out.count)
          }
        }
      }
    }
    var fd: Int32
  }
  func start() {
    print("Server starting...")

    let socketFD = socket(AF_INET6, //Domain [AF_INET,AF_INET6, AF_UNIX]
                          SOCK_STREAM, //Type [SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW]
                          IPPROTO_TCP  //Protocol [IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP]
                          )//Return a FileDescriptor -1 = error
    if socketFD == -1 {
      print("Error creating BSD Socket")
      return
    }

    var hints = addrinfo(
      ai_flags: AI_PASSIVE,       // Assign the address of the local host to the socket structures
      ai_family: AF_UNSPEC,       // Either IPv4 or IPv6
      ai_socktype: SOCK_STREAM,   // TCP
      ai_protocol: 0,
      ai_addrlen: 0,
      ai_canonname: nil,
      ai_addr: nil,
      ai_next: nil)

    var servinfo: UnsafeMutablePointer<addrinfo>? = nil
    let addrInfoResult = getaddrinfo(
      nil,                        // Any interface
      servicePort,                   // The port on which will be listenend
      &hints,                     // Protocol configuration as per above
      &servinfo)

    if addrInfoResult != 0 {
      print("Error getting address info: \(errno)")
      return
    }

    let bindResult = bind(socketFD, servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))

    if bindResult == -1 {
      print("Error binding socket to Address: \(errno)")
      return
    }

    let listenResult = listen(socketFD, //Socket File descriptor
                              128         // The backlog argument defines the maximum length the queue of pending connections may grow to
    )
/**
    let flags = fcntl(socketFD,F_GETFL)
    let _ = fcntl(socketFD,F_SETFL,flags | O_NONBLOCK)
*/

    if listenResult == -1 {
      print("Error setting our socket to listen")
      return
    }
    while (!self.ende) {
      var addr = sockaddr()
      var addr_len :socklen_t = 0
      while (true) {
          while(semaphore > 4){}
          print("About to accept")
          let accFD = accept(socketFD, &addr, &addr_len)
          semaphore -= 1
          if (accFD > 0){
/**              let flags = fcntl(accFD,F_GETFL)
              let _ = fcntl(accFD,F_SETFL,flags & ~O_NONBLOCK)
*/
              print("Accepted new client with file descriptor: \(accFD)")
              let handle = Worker(accFD);
              handle.start()
            } else {
                print("Error accepting connection")
            }
        }
    }
  }

}


-- 

7-77-777
Evil Sinner!
to weak you should be meek, and you should brainfuck stronger
https://github.com/rofl0r/chaos-pp

Back to comp.programming.threads | Previous | Next — Next in thread | Find similar | Unroll thread


Thread

Sum server [Swift] Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-03 19:07 +0000
  Re: Sum server,improved slightly [Swift] Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-04 04:30 +0000
    Re: Sum server, mutch improved [Swift] Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-05 02:17 +0000
      Re: Sum server, finished [Swift] Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-05 19:22 +0000
        Re: Sum server, finished, bugs corrected, accept now nonblocking as well [Swift] Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-05 22:51 +0000
          Re: Sum server, finished, bugs corrected, accept now nonblocking as well, tweaked [Swift] Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-06 02:49 +0000
            Re: Sum server, finished, better, without usleep [Swift] Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-06 09:34 +0000
              Re: Sum server, finished, better, without usleep [Swift] Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-06 17:03 +0000

csiph-web