Index: pjlib/src/pj/ioqueue_winnt.c =================================================================== --- pjlib/src/pj/ioqueue_winnt.c (revision 3047) +++ pjlib/src/pj/ioqueue_winnt.c (working copy) @@ -167,14 +167,27 @@ /* * Process the socket when the overlapped accept() completed. */ -static void ioqueue_on_accept_complete(ioqueue_accept_rec *accept_overlapped) +static void ioqueue_on_accept_complete(pj_ioqueue_key_t *key, + ioqueue_accept_rec *accept_overlapped) { struct sockaddr *local; struct sockaddr *remote; int locallen, remotelen; + pj_status_t status; PJ_CHECK_STACK(); + /* On WinXP or later, use SO_UPDATE_ACCEPT_CONTEXT so that socket + * addresses can be obtained with getsockname() and getpeername(). + */ + status = setsockopt(accept_overlapped->newsock, SOL_SOCKET, + SO_UPDATE_ACCEPT_CONTEXT, + (char*)&key->hnd, + sizeof(SOCKET)); + /* SO_UPDATE_ACCEPT_CONTEXT is for WinXP or later. + * So ignore the error status. + */ + /* Operation complete immediately. */ if (accept_overlapped->addrlen) { GetAcceptExSockaddrs( accept_overlapped->accept_buf, @@ -706,7 +719,7 @@ #if PJ_HAS_TCP case PJ_IOQUEUE_OP_ACCEPT: /* special case for accept. */ - ioqueue_on_accept_complete((ioqueue_accept_rec*)pOv); + ioqueue_on_accept_complete(key, (ioqueue_accept_rec*)pOv); if (key->cb.on_accept_complete) { ioqueue_accept_rec *accept_rec = (ioqueue_accept_rec*)pOv; pj_status_t status = PJ_SUCCESS; @@ -1240,16 +1253,6 @@ if (status != PJ_SUCCESS) return status; - /* On WinXP or later, use SO_UPDATE_ACCEPT_CONTEXT so that socket - * addresses can be obtained with getsockname() and getpeername(). - */ - status = setsockopt(op_key_rec->accept.newsock, SOL_SOCKET, - SO_UPDATE_ACCEPT_CONTEXT, - (char*)&key->hnd, sizeof(SOCKET)); - /* SO_UPDATE_ACCEPT_CONTEXT is for WinXP or later. - * So ignore the error status. - */ - op_key_rec->accept.operation = PJ_IOQUEUE_OP_ACCEPT; op_key_rec->accept.addrlen = addrlen; op_key_rec->accept.local = local; @@ -1265,7 +1268,7 @@ &op_key_rec->accept.overlapped ); if (rc == TRUE) { - ioqueue_on_accept_complete(&op_key_rec->accept); + ioqueue_on_accept_complete(key, &op_key_rec->accept); return PJ_SUCCESS; } else { DWORD dwStatus = WSAGetLastError(); Index: pjlib/src/pjlib-test/ioq_tcp.c =================================================================== --- pjlib/src/pjlib-test/ioq_tcp.c (revision 3047) +++ pjlib/src/pjlib-test/ioq_tcp.c (working copy) @@ -97,6 +97,15 @@ "invalid socket and status is %d", status)); } } else { + pj_sockaddr addr; + int client_addr_len; + + client_addr_len = sizeof(addr); + status = pj_sock_getsockname(sock, &addr, &client_addr_len); + if (status != PJ_SUCCESS) { + app_perror("...ERROR in pj_sock_getsockname()", status); + } + callback_accept_key = key; callback_accept_op = op_key; callback_accept_status = status;