Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
DBE-DS-Group1-WS24
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Robin Leber
DBE-DS-Group1-WS24
Commits
2de4bb79
Commit
2de4bb79
authored
Jan 25, 2024
by
Quoc Nguyen Dao
Browse files
Options
Downloads
Patches
Plain Diff
broadcast -> multicast
parent
3e103570
No related branches found
No related tags found
1 merge request
!2
leader election und heartbeat
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
client.py
+14
-13
14 additions, 13 deletions
client.py
server.py
+40
-30
40 additions, 30 deletions
server.py
with
54 additions
and
43 deletions
client.py
+
14
−
13
View file @
2de4bb79
...
...
@@ -2,16 +2,17 @@ import socket
import
threading
from
datetime
import
datetime
MULTICAST_GROUP_IP
=
'
224.1.1.1
'
# Broadcast address and port
BROADCAST_IP
=
"
192.168.0.255
"
BROAD
CAST_PORT
=
5973
CLIENT_MULTI
CAST_PORT
=
5973
# Local host information
MY_HOST
=
socket
.
gethostname
()
MY_IP
=
socket
.
gethostbyname
(
MY_HOST
)
class
Client
():
def
__init__
(
self
):
self
.
currentLeader
=
''
...
...
@@ -23,23 +24,23 @@ class Client():
print
(
f
'
[
{
current_date_time
}
]
{
msg
}
'
)
# dynamic discoverey: client sends request to server group and gets the IP of server as reply
def
BroadcastSendAndReceive
(
self
):
message
=
'
New client wants to connect:
'
+
MY_IP
def
MulticastSendAndReceive
(
self
):
# Create a UDP socket
broadcast_socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
# Send message on broadcast address
broadcast_socket
.
sendto
(
str
.
encode
(
message
),
(
BROADCAST_IP
,
BROADCAST_PORT
))
multicast_socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
# Send broadcast message
# Set the time-to-live for messages to 1 so they do not go past the local network segment
multicast_socket
.
setsockopt
(
socket
.
IPPROTO_IP
,
socket
.
IP_MULTICAST_TTL
,
1
)
# Send message on multicast address
message
=
'
New client wants to connect:
'
+
MY_IP
multicast_socket
.
sendto
(
str
.
encode
(
message
),
(
MULTICAST_GROUP_IP
,
CLIENT_MULTICAST_PORT
))
self
.
printwt
(
"
Sent my IP to server group
"
)
while
True
:
try
:
# receive reply data (server IP) from the other participants
reply
,
addr
=
broad
cast_socket
.
recvfrom
(
1024
)
reply
,
addr
=
multi
cast_socket
.
recvfrom
(
1024
)
if
reply
:
# decode received data
...
...
@@ -82,6 +83,6 @@ class Client():
if
__name__
==
"
__main__
"
:
client
=
Client
()
thread1
=
threading
.
Thread
(
target
=
client
.
Broad
castSendAndReceive
)
thread1
=
threading
.
Thread
(
target
=
client
.
Multi
castSendAndReceive
)
thread1
.
start
()
thread1
.
join
()
\ No newline at end of file
This diff is collapsed.
Click to expand it.
server.py
+
40
−
30
View file @
2de4bb79
...
...
@@ -2,14 +2,15 @@ import socket
import
threading
from
datetime
import
datetime
import
time
import
struct
BROADCAST_IP
=
"
192.168.0.255
"
MULTICAST_GROUP_IP
=
'
224.1.1.1
'
# Listening port Server Discovery
SERVER_
BROAD
CAST_PORT
=
5974
SERVER_
MULTI
CAST_PORT
=
5974
# Listening port Client Discovery
CLIENT_
BROAD
CAST_PORT
=
5973
CLIENT_
MULTI
CAST_PORT
=
5973
# Local host information
MY_HOST
=
socket
.
gethostname
()
...
...
@@ -34,22 +35,26 @@ class Server():
print
(
"
Group view is:
"
,
self
.
serverList
)
#This function enables the server to listen to the server
broad
cast port and reply the ip address
def
Broad
castListenAndReply
(
self
):
#This function enables the server to listen to the server
multi
cast port and reply the ip address
def
Multi
castListenAndReply
(
self
):
# if my IP is not in the server list add it
if
MY_IP
not
in
self
.
serverList
:
self
.
serverList
.
append
(
MY_IP
)
# create socket bind to server address
broadcast_listen_sock
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
broadcast_listen_sock
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
,
1
)
broadcast_listen_sock
.
bind
((
MY_IP
,
SERVER_BROADCAST_PORT
))
multicast_listen_sock
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
multicast_listen_sock
.
bind
((
''
,
SERVER_MULTICAST_PORT
))
# tell the os to add the socket to the multicast group
multicast_group
=
socket
.
inet_aton
(
MULTICAST_GROUP_IP
)
mreg
=
struct
.
pack
(
'
4sL
'
,
multicast_group
,
socket
.
INADDR_ANY
)
multicast_listen_sock
.
setsockopt
(
socket
.
IPPROTO_IP
,
socket
.
IP_ADD_MEMBERSHIP
,
mreg
)
while
True
:
data
,
address
=
broad
cast_listen_sock
.
recvfrom
(
1024
)
data
,
address
=
multi
cast_listen_sock
.
recvfrom
(
1024
)
if
data
:
newServer_address
=
data
.
decode
()
...
...
@@ -62,7 +67,7 @@ class Server():
self
.
serverList
.
append
(
newServer_address
)
reply_message
=
MY_IP
broad
cast_listen_sock
.
sendto
(
str
.
encode
(
reply_message
),
address
)
multi
cast_listen_sock
.
sendto
(
str
.
encode
(
reply_message
),
address
)
self
.
printwt
(
'
Replied my IP to new participant
'
)
...
...
@@ -73,19 +78,20 @@ class Server():
self
.
printwt
(
f
'
The current leader IP is:
{
self
.
leader_IP
}
'
)
#this function enables the server to send a
broad
cast to the server group and receive the answers of existing members
def
Broad
castSendAndReceive
(
self
):
#this function enables the server to send a
multi
cast to the server group and receive the answers of existing members
def
Multi
castSendAndReceive
(
self
):
# create socket
broad
cast_group
=
(
BROADCAST
_IP
,
SERVER_
BROAD
CAST_PORT
)
broad
cast_send_sock
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
broadcast_send_sock
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_BROADCAST
,
1
)
broad
cast_send_sock
.
settimeout
(
2
)
multi
cast_group
=
(
MULTICAST_GROUP
_IP
,
SERVER_
MULTI
CAST_PORT
)
multi
cast_send_sock
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
# Set a timeout so the socket does not block indefinitely when trying to receive data.
multi
cast_send_sock
.
settimeout
(
2
)
# ...
# Set the time-to-live for messages to 1 so they do not go past the local network segment.
multicast_send_sock
.
setsockopt
(
socket
.
IPPROTO_IP
,
socket
.
IP_MULTICAST_TTL
,
1
)
message
=
MY_IP
broad
cast_send_sock
.
sendto
(
message
.
encode
(),
broad
cast_group
)
multi
cast_send_sock
.
sendto
(
message
.
encode
(),
multi
cast_group
)
self
.
printwt
(
"
Sent my IP to server group
"
)
# if my IP is not in the server list add it
...
...
@@ -106,7 +112,7 @@ class Server():
try
:
# receive reply data from the other participants
reply
,
address
=
broad
cast_send_sock
.
recvfrom
(
1024
)
reply
,
address
=
multi
cast_send_sock
.
recvfrom
(
1024
)
if
reply
:
reply_address
=
reply
.
decode
()
...
...
@@ -126,7 +132,7 @@ class Server():
break
if
num_responses
==
1
:
broad
cast_send_sock
.
close
()
multi
cast_send_sock
.
close
()
self
.
isLeader
=
True
self
.
leader_IP
=
MY_IP
# Hier wird die IP-Adresse des Leaders zugewiesen
self
.
printwt
(
f
'
I am the only server in the system, so the leader IP is:
{
self
.
leader_IP
}
'
)
...
...
@@ -136,19 +142,23 @@ class Server():
self
.
print_group_view
()
# Listen to client
broad
cast (request) and reply with Server IP
# Listen to client
multi
cast (request) and reply with Server IP
def
ListenForClientAndReply
(
self
):
# Create a UDP socket
listen_socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
# Set the socket to broadcast and enable reusing addresses
listen_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_BROADCAST
,
1
)
# Enable reusing addresses
listen_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
,
1
)
# Bind socket to address and port
listen_socket
.
bind
((
MY_IP
,
CLIENT_BROADCAST_PORT
))
listen_socket
.
bind
((
MY_IP
,
CLIENT_MULTICAST_PORT
))
# tell the os to add the socket to the multicast group
multicast_group
=
socket
.
inet_aton
(
MULTICAST_GROUP_IP
)
mreg
=
struct
.
pack
(
'
4sL
'
,
multicast_group
,
socket
.
INADDR_ANY
)
listen_socket
.
setsockopt
(
socket
.
IPPROTO_IP
,
socket
.
IP_ADD_MEMBERSHIP
,
mreg
)
# print("Listening to
broad
cast messages")
# print("Listening to
multi
cast messages")
# Receiving
broad
cast massage
# Receiving
multi
cast massage
while
True
:
data
,
addr
=
listen_socket
.
recvfrom
(
1024
)
...
...
@@ -169,13 +179,13 @@ class Server():
data
=
client_socket
.
recv
(
1024
)
if
not
data
:
break
self
.
broad
cast
(
data
,
client_socket
)
self
.
multi
cast
(
data
,
client_socket
)
except
:
self
.
clients
.
remove
(
client_socket
)
break
def
broad
cast
(
self
,
message
,
sender_socket
):
def
multi
cast
(
self
,
message
,
sender_socket
):
for
client
in
self
.
clients
:
try
:
if
client
!=
sender_socket
:
...
...
@@ -188,10 +198,10 @@ class Server():
if
__name__
==
'
__main__
'
:
server
=
Server
()
thread2
=
threading
.
Thread
(
target
=
server
.
Broad
castListenAndReply
)
thread2
=
threading
.
Thread
(
target
=
server
.
Multi
castListenAndReply
)
thread2
.
start
()
thread3
=
threading
.
Thread
(
target
=
server
.
Broad
castSendAndReceive
)
thread3
=
threading
.
Thread
(
target
=
server
.
Multi
castSendAndReceive
)
thread3
.
start
()
thread1
=
threading
.
Thread
(
target
=
server
.
ListenForClientAndReply
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment