connectex.pxi 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. # Copyright (c) Twisted Matrix Laboratories.
  2. # See LICENSE for details.
  3. def connect(long s, object addr, object obj):
  4. """
  5. CAUTION: unlike system ConnectEx(), this function returns 0 on success
  6. """
  7. cdef int family, rc
  8. cdef myOVERLAPPED *ov
  9. cdef sockaddr_in ipv4_name
  10. cdef sockaddr_in6 ipv6_name
  11. cdef sockaddr *name
  12. cdef int namelen
  13. if not have_connectex:
  14. raise ValueError, 'ConnectEx is not available on this system'
  15. family = getAddrFamily(s)
  16. if family == AF_INET:
  17. name = <sockaddr *>&ipv4_name
  18. namelen = sizeof(ipv4_name)
  19. fillinetaddr(&ipv4_name, addr)
  20. elif family == AF_INET6:
  21. name = <sockaddr *>&ipv6_name
  22. namelen = sizeof(ipv6_name)
  23. fillinet6addr(&ipv6_name, addr)
  24. else:
  25. raise ValueError, 'unsupported address family'
  26. name.sa_family = family
  27. ov = makeOV(obj)
  28. rc = lpConnectEx(s, name, namelen, NULL, 0, NULL, <OVERLAPPED *>ov)
  29. if not rc:
  30. rc = WSAGetLastError()
  31. if rc != ERROR_IO_PENDING:
  32. unmakeOV(ov)
  33. return rc
  34. return 0