Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.programming.threads > #6925
| Newsgroups | comp.programming.threads |
|---|---|
| From | Branimir Maksimovic <branimir.maksimovic@icloud.com> |
| Subject | Re: Sum server, mutch improved [Swift] |
| References | <icn6J.5878$2m1.2082@fx26.iad> <Prv6J.32274$dI3.27972@fx10.iad> |
| Message-ID | <RAO6J.64731$jm6.37037@fx07.iad> (permalink) |
| Organization | usenet-news.net |
| Date | 2021-10-05 02:17 +0000 |
On 2021-10-04, Branimir Maksimovic <branimir.maksimovic@icloud.com> wrote:
import Foundation
signal(SIGPIPE,SIG_IGN)
let s = Server();
s.start()
var ende:Bool? = nil
var semacnt:Int? = nil
var mutex:Bool? = nil
var accarrFD:[Int32]? = nil
class Server {
init() {
if (CommandLine.argc > 1) {
tmpSvcPort = Int(CommandLine.arguments[1]) ?? 0
if (tmpSvcPort > 0){ servicePort = String(tmpSvcPort) }
}
semacnt! = 0
mutex! = false
ende! = false
accarrFD! = Array(repeating:Int32(0),count:0)
}
var tmpSvcPort: Int = 0
var servicePort = "1234"
class Worker:Thread{
init(_ fd:Int32){
self.fd = fd
semacnt! += 1
}
deinit {
semacnt! -= 1
}
override func main(){
let MTU = 65536
let buffer = UnsafeMutablePointer<CChar>.allocate(capacity:MTU)
defer {
buffer.deallocate()
}
while (mutex! == true){usleep(100)}
mutex! = true
print("acquired")
var oneFD = Array(repeating:Int32(0),count:0)
while (!accarrFD!.isEmpty){
/// collect rest of fds
oneFD.append(accarrFD![accarrFD!.count-1])
accarrFD!.remove(at:accarrFD!.count-1)
}
mutex! = false /// seems we do not need barrier
print("releazed\n")
var toproc = [fd]
toproc += oneFD
for fd in toproc{
defer {close(fd)}
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 cset = CharacterSet(charactersIn: " \r\n")
let numbers = strResult.components(separatedBy: cset)
var sum = 0
if numbers.count > 1 {
if numbers[0].lowercased() == "quit" {
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 {
/**let flags = fcntl(fd,F_GETFL)
let _ = fcntl(fd,F_SETFL,flags | O_NONBLOCK)
*/
while(semacnt! > 128){usleep(100)}
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
}
setsockopt(socketFD,SOL_SOCKET,SO_REUSEADDR,servinfo!.pointee.ai_addr, socklen_t(servinfo!.pointee.ai_addrlen))
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 (!ende!) {
var addr = sockaddr()
var addr_len :socklen_t = 0
while (!ende!) {
print("About to accept")
let accFD = accept(socketFD, &addr, &addr_len)
if (accFD > 0){
print("Accepted new client with file descriptor: \(accFD)")
if (semacnt! < 5) {
let handle = Worker(accFD);
handle.start()
} else {
while (mutex! == true){usleep(100)}
mutex! = true /// works fine without barrier
accarrFD!.append(accFD)
mutex! = false
}
} else {
print("Error accepting connection")
usleep(100)
}
OSMemoryBarrier() /// barrier needed here
}
}
}
}
--
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 — Previous in thread | Next in thread | Find similar | Unroll 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