2014-09-16 3 views
3

스위프트를 처음 사용하고 UDP 연결에 대해 몇 가지 질문이 있습니다.스위프트 UDP 연결

누군가 Swift 클라이언트를 Java 서버에 어떻게 연결할 수 있는지 보여주는 짧은 코드 줄 또는 링크를 제공 할 수 있습니까?

+2

아마도 이것을 사용하고 싶을 것입니다 - https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles /UsingSocketsandSocketStreams.html#//apple_ref/doc/uid/CH73-SW12 – admdrew

+0

신속한 예제 코드? – user3838885

+0

'신속한 예제 코드? '현재 문제가있는 * 코드를 게시 할 수 있습니까? 그렇지 않으면, 이것은 아마도 주제를 벗어난 것입니다 (누군가에게 코드를 작성하도록 요청했거나 오프 사이트 자원을 찾고 있기 때문에). – admdrew

답변

3

'Darwin'모듈에서 관련 C 함수 만 사용할 수 있습니다. 조금 까다로운 부분은 sockaddr_xyz 구조체에서 일반 sockaddr (아마도 누군가 내 것보다 더 나은 해결책을 가지고 있습니다 ...)으로 캐스팅하는 것입니다. 그렇지 않으면 꽤 똑바로됩니다.

Swift 0.2 일명 Xcode 6.3.1 (strlen()은 Int로 변환되어야 함)에 대해 업데이트되었습니다.

샘플 :

let textToSend = "Hello World!" 

func htons(value: CUnsignedShort) -> CUnsignedShort { 
    return (value << 8) + (value >> 8); 
} 

let INADDR_ANY = in_addr(s_addr: 0) 

let fd = socket(AF_INET, SOCK_DGRAM, 0) // DGRAM makes it UDP 

var addr = sockaddr_in(
    sin_len: __uint8_t(sizeof(sockaddr_in)), 
    sin_family: sa_family_t(AF_INET), 
    sin_port: htons(1337), 
    sin_addr: INADDR_ANY, 
    sin_zero: (0, 0, 0, 0, 0, 0, 0, 0) 
) 

textToSend.withCString { cstr -> Void in 
    withUnsafePointer(&addr) { ptr -> Void in 
    let addrptr = UnsafePointer<sockaddr>(ptr) 
    sendto(fd, cstr, Int(strlen(cstr)), 0, 
      addrptr, socklen_t(addr.sin_len)) 
    } 
} 
+0

오, 여기에 in_addr 등 편의 기능 확장이 몇 가지 있습니다. https://github.com/AlwaysRightInstitute/SwiftSockets/blob/master/ARISockets/SocketAddress.swift – hnh

+1

이 게시물이 게시 된 이후로 변경된 사항이 있는지는 확실하지 않지만 나는'cstr'에 Void 포인터를'let string = UnsafePointer (cstr)'처럼 만들 필요가 있고 또한'strlen (cstr)'을 Int :'Int (strlen (cstr))'로 캐스팅하고 함수에 사용했다. : 'sendto (fd, string, Int (strlen (cstr)), 0, addrptr, socklen_t (addr.sin_len))' – Fonix

+0

감사합니다. 현재 Swift에 대한 Int() 변경을 수행했습니다. 하지만 나에게 그것은 Void cast가없는 것으로 가정하고, UnsafePointer는 으로 투명하게 UnsafePointer (Xcode 6.3.1)으로 변환됩니다. – hnh

1

꽤 광범위한 연구가 GCD의 AsyncSocket으로 기본적인 포인터오고, 그리고 순수한 스위프트는 아이폰 OS 프로그래머 훈련을받은 후, 나는 기본 스위프트 소켓을 지원하는 뭔가를 보았다.

감사하게도 SwiftSocket이라는 비동기 사용에 대한 훨씬 간단한 대안을 발견했습니다.

github (https://github.com/xyyc/SwiftSocket)에는 대부분의 소켓에 대한 예제가 있으며 프로젝트에 몇 개의 파일 만 복사하여 사용할 준비가되었습니다.

신속한 개발자의 경우, 사용률이 낮아 비대륙 형 앱에 대해 Async를 빠르게 대체 할 것입니다. 그렇다면 다시 나는이 물건에 매우 익숙해 져서 벗어날 수 있습니다. D