ServerSocket TcpServerSocket_create(char* address, int port) { ServerSocket serverSocket = NULL; int fd; if ((fd = socket(AF_INET, SOCK_STREAM, 0)) >= 0) { struct sockaddr_in serverAddress; prepareServerAddress(address, port, &serverAddress); //TODO check if this works with BSD int optionReuseAddr = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &optionReuseAddr, sizeof(int)); if (bind(fd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) >= 0) { serverSocket = malloc(sizeof(struct sServerSocket)); serverSocket->fd = fd; serverSocket->backLog = 0; } else { close(fd); return NULL ; } #if (CONFIG_ACTIVATE_TCP_KEEPALIVE == 1) activateKeepAlive(fd); #endif } return serverSocket; }
ServerSocket TcpServerSocket_create(char* address, int port) { ServerSocket serverSocket = NULL; int ec; WSADATA wsa; SOCKET listen_socket = INVALID_SOCKET; struct sockaddr_in server_addr; if (ec = WSAStartup(MAKEWORD(2,0), &wsa) != 0) { printf("winsock error: code %i\n"); return NULL; } server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(port); listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); #if (CONFIG_ACTIVATE_TCP_KEEPALIVE == 1) activateKeepAlive(listen_socket); #endif if (listen_socket == INVALID_SOCKET) { printf("socket failed with error: %i\n", WSAGetLastError()); WSACleanup(); return 1; } ec = bind(listen_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); if (ec == SOCKET_ERROR) { printf("bind failed with error:%i\n", WSAGetLastError()); closesocket(listen_socket); WSACleanup(); return 1; } serverSocket = malloc(sizeof(struct sServerSocket)); serverSocket->fd = listen_socket; serverSocket->backLog = 10; return serverSocket; }
int Socket_connect(Socket self, char* address, int port) { struct sockaddr_in serverAddress; prepareServerAddress(address, port, &serverAddress); self->fd = socket(AF_INET, SOCK_STREAM, 0); #if (CONFIG_ACTIVATE_TCP_KEEPALIVE == 1) activateKeepAlive(self->fd); #endif if (connect(self->fd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) return 0; else return 1; }
bool Socket_connect(Socket self, const char* address, int port) { struct sockaddr_in serverAddress; if (DEBUG_SOCKET) printf("Socket_connect: %s:%i\n", address, port); if (!prepareServerAddress(address, port, &serverAddress)) return false; self->fd = socket(AF_INET, SOCK_STREAM, 0); #if CONFIG_ACTIVATE_TCP_KEEPALIVE == 1 activateKeepAlive(self->fd); #endif fd_set fdSet; FD_ZERO(&fdSet); FD_SET(self->fd, &fdSet); fcntl(self->fd, F_SETFL, O_NONBLOCK); if (connect(self->fd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) { if (errno != EINPROGRESS) return false; } struct timeval timeout; timeout.tv_sec = self->connectTimeout / 1000; timeout.tv_usec = (self->connectTimeout % 1000) * 1000; if (select(self->fd + 1, NULL, &fdSet, NULL, &timeout) <= 0) return false; else return true; }
ServerSocket TcpServerSocket_create(const char* address, int port) { ServerSocket serverSocket = NULL; int fd; if ((fd = socket(AF_INET, SOCK_STREAM, 0)) >= 0) { struct sockaddr_in serverAddress; if (!prepareServerAddress(address, port, &serverAddress)) { close(fd); return NULL; } int optionReuseAddr = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &optionReuseAddr, sizeof(int)); if (bind(fd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) >= 0) { serverSocket = GLOBAL_MALLOC(sizeof(struct sServerSocket)); serverSocket->fd = fd; serverSocket->backLog = 0; } else { close(fd); return NULL ; } #if CONFIG_ACTIVATE_TCP_KEEPALIVE == 1 activateKeepAlive(fd); #endif setSocketNonBlocking((Socket) serverSocket); } return serverSocket; }