Fix bind() calls to receive the correct size of sockaddr structure (#1490)
For some implementations (e.g. Mac OS) `bind()` requires the length to be exactly equal to either `sockaddr_in` or `sockaddr_in6` structure. Because we always used `sizeof(struct sockaddr_storage)`, `bind()` was returning errors. In this change we fix the behavior. See StackOverflow [1] for details. [1] https://stackoverflow.com/questions/73707162/socket-bind-failed-with-invalid-argument-error-for-program-running-on-macos
This commit is contained in:
@ -73,10 +73,12 @@ main(int argc, char *argv[])
|
||||
|
||||
if (argc > 1 && strcmp(argv[1], "inet6") == 0) {
|
||||
af = AF_INET6;
|
||||
addrlen = sizeof(struct sockaddr_in6);
|
||||
init_sockaddr_inet6((struct sockaddr_in6 *)&addr);
|
||||
}
|
||||
else {
|
||||
af = AF_INET;
|
||||
addrlen = sizeof(struct sockaddr_in6);
|
||||
init_sockaddr_inet((struct sockaddr_in *)&addr);
|
||||
}
|
||||
|
||||
@ -88,7 +90,6 @@ main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
printf("[Server] Bind socket\n");
|
||||
addrlen = sizeof(addr);
|
||||
if (bind(socket_fd, (struct sockaddr *)&addr, addrlen) < 0) {
|
||||
perror("Bind failed");
|
||||
goto fail;
|
||||
@ -102,6 +103,7 @@ main(int argc, char *argv[])
|
||||
|
||||
printf("[Server] Wait for clients to connect ..\n");
|
||||
while (connections < WORKER_NUM) {
|
||||
addrlen = sizeof(struct sockaddr);
|
||||
client_sock_fds[connections] =
|
||||
accept(socket_fd, (struct sockaddr *)&addr, (socklen_t *)&addrlen);
|
||||
if (client_sock_fds[connections] < 0) {
|
||||
|
||||
Reference in New Issue
Block a user