| 151 | } |
| 152 | |
| 153 | int SocketClientUDP::bind () |
| 154 | { |
| 155 | // for socket clients which dont call sendto before recvfrom bind should be called on client |
| 156 | // side |
| 157 | // https://stackoverflow.com/questions/3057029/do-i-have-to-bind-a-udp-socket-in-my-client-program-to-receive-data-i-always-g |
| 158 | if (connect_socket != INVALID_SOCKET) |
| 159 | { |
| 160 | return (int)SocketClientUDPReturnCodes::SOCKET_ALREADY_CREATED_ERROR; |
| 161 | } |
| 162 | |
| 163 | WSADATA wsadata; |
| 164 | int res = WSAStartup (MAKEWORD (2, 2), &wsadata); |
| 165 | if (res != 0) |
| 166 | { |
| 167 | return (int)SocketClientUDPReturnCodes::WSA_STARTUP_ERROR; |
| 168 | } |
| 169 | socket_addr.sin_family = AF_INET; |
| 170 | socket_addr.sin_port = htons (port); |
| 171 | socket_addr.sin_addr.s_addr = htonl (INADDR_ANY); |
| 172 | connect_socket = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
| 173 | if (connect_socket == INVALID_SOCKET) |
| 174 | { |
| 175 | return (int)SocketClientUDPReturnCodes::CREATE_SOCKET_ERROR; |
| 176 | } |
| 177 | |
| 178 | // ensure that library will not hang in blocking recv/send call |
| 179 | DWORD timeout = 5000; |
| 180 | setsockopt (connect_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof (timeout)); |
| 181 | setsockopt (connect_socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof (timeout)); |
| 182 | |
| 183 | if (::bind (connect_socket, (const struct sockaddr *)&socket_addr, sizeof (socket_addr)) != 0) |
| 184 | { |
| 185 | return (int)SocketClientUDPReturnCodes::CONNECT_ERROR; |
| 186 | } |
| 187 | return (int)SocketClientUDPReturnCodes::STATUS_OK; |
| 188 | } |
| 189 | |
| 190 | int SocketClientUDP::get_local_port () |
| 191 | { |
no outgoing calls
no test coverage detected