mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 20:32:36 +00:00
64 lines
1.4 KiB
C
64 lines
1.4 KiB
C
#include "syshdrs.h"
|
|
|
|
int
|
|
SBind(int sockfd, const int port, const int nTries, const int reuseFlag)
|
|
{
|
|
unsigned int i;
|
|
int on;
|
|
int onsize;
|
|
struct sockaddr_in localAddr;
|
|
|
|
localAddr.sin_family = AF_INET;
|
|
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
localAddr.sin_port = htons((unsigned short) port);
|
|
|
|
if (reuseFlag != kReUseAddrNo) {
|
|
/* This is mostly so you can quit the server and re-run it
|
|
* again right away. If you don't do this, the OS may complain
|
|
* that the address is still in use.
|
|
*/
|
|
on = 1;
|
|
onsize = (int) sizeof(on);
|
|
(void) setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
|
|
(char *) &on, onsize);
|
|
|
|
#ifdef SO_REUSEPORT
|
|
/* Tells kernel that it's okay to have more
|
|
* than one process originating from this
|
|
* local port.
|
|
*/
|
|
on = 1;
|
|
onsize = (int) sizeof(on);
|
|
(void) setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT,
|
|
(char *) &on, onsize);
|
|
#endif /* SO_REUSEPORT */
|
|
}
|
|
|
|
for (i=1; ; i++) {
|
|
/* Try binding a few times, in case we get Address in Use
|
|
* errors.
|
|
*/
|
|
if (bind(sockfd, (struct sockaddr *) &localAddr, sizeof(struct sockaddr_in)) == 0) {
|
|
break;
|
|
}
|
|
if ((int) i == nTries) {
|
|
return (-1);
|
|
}
|
|
/* Give the OS time to clean up the old socket,
|
|
* and then try again.
|
|
*/
|
|
sleep(i * 3);
|
|
}
|
|
|
|
return (0);
|
|
} /* SBind */
|
|
|
|
|
|
|
|
|
|
int
|
|
SListen(int sfd, int backlog)
|
|
{
|
|
return (listen(sfd, (unsigned int) backlog));
|
|
} /* SListen */
|