teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

表記の改善

2017/11/13 01:57

投稿

hyu_sy
hyu_sy

スコア7

title CHANGED
File without changes
body CHANGED
@@ -32,17 +32,13 @@
32
32
  let fd = socket(AF_INET, SOCK_DGRAM, 0) // DGRAM makes it UDP
33
33
  var sendtext = textToSend
34
34
  var addr = getaddrinfo(address: address, port: port)
35
- print(addr.sin_addr ,",", addr.sin_port)
35
+
36
-
37
36
  withUnsafeMutablePointer(to: &sendtext) { textp in
38
37
  let cstr = UnsafeRawPointer(textp)
39
38
  withUnsafePointer(to: &addr){sockaddrInPtr in
40
-
41
39
  sockaddrInPtr.withMemoryRebound(to: sockaddr.self, capacity: 1){ sockaddrPtr in
42
40
  let check = sendto(fd, cstr, Int(strlen(sendtext)), 0, sockaddrPtr , socklen_t(MemoryLayout<sockaddr>.stride))
43
- print(check)
41
+ print(check)
44
- print(sendtext)
45
-
46
42
  }
47
43
  }
48
44
  }

2

```ぬけ

2017/11/13 01:57

投稿

hyu_sy
hyu_sy

スコア7

title CHANGED
File without changes
body CHANGED
@@ -10,6 +10,7 @@
10
10
 
11
11
  ###該当のソースコード
12
12
  //sockaddr_inを作る関数
13
+ ```
13
14
  func getaddrinfo( address: String, port: CUnsignedShort) -> sockaddr_in{
14
15
  let ipOcts = address.components(separatedBy: ".")
15
16
  let ipInt = ipOcts.enumerated().reduce(UInt32(0)){ (val, elm) in

1

ポインタの処理を書き直し、sockaddr_inの関数化を行いました。また、sendto()の戻り値の確認も行なった結果、正常に送信文字数が入っていました。

2017/11/13 01:55

投稿

hyu_sy
hyu_sy

スコア7

title CHANGED
@@ -1,1 +1,1 @@
1
- Swift3 UDP Client
1
+ Swift3 UDP Client 指定ipにデータの送信ができない
body CHANGED
@@ -9,45 +9,42 @@
9
9
  PC側でデータの受信ができません
10
10
 
11
11
  ###該当のソースコード
12
- ```Swift3
13
-
14
- udpSend(textToSend: "Hello World!", address: ipAddr, port: 6666)
12
+ //sockaddr_inを作る関数
15
-
16
- func udpSend(textToSend: String, address: String, port: CUnsignedShort) {
13
+ func getaddrinfo( address: String, port: CUnsignedShort) -> sockaddr_in{
17
- func htons(value: CUnsignedShort) -> CUnsignedShort {
18
- return (value << 8) + (value >> 8);
19
- }
20
-
21
- let port: UInt16 = 6666
22
-
23
- //let ipAdd = "192.168.1.81"
24
14
  let ipOcts = address.components(separatedBy: ".")
25
15
  let ipInt = ipOcts.enumerated().reduce(UInt32(0)){ (val, elm) in
26
16
  let u32 = UInt32(elm.element)!
27
17
  let shiftBits = 24 - UInt32(elm.offset) * 8
28
18
  return val | (u32 << shiftBits)
29
-
30
19
  }
31
-
32
- let fd = socket(AF_INET, SOCK_DGRAM, 0)
33
- var addr = sockaddr_in(
20
+ return sockaddr_in(
34
- sin_len: __uint8_t(MemoryLayout<sockaddr_in>.size),
21
+ sin_len: UInt8(MemoryLayout<sockaddr_in>.stride),
35
- sin_family: sa_family_t(AF_INET),
22
+ sin_family: UInt8(AF_INET),
36
23
  sin_port: port.bigEndian,
37
24
  sin_addr: in_addr(s_addr: ipInt),
38
25
  sin_zero: ( 0, 0, 0, 0, 0, 0, 0, 0 )
39
26
  )
27
+ }
40
28
 
41
-     // 以下が問題のsendto付近です。
42
- textToSend.withCString { cstr -> Void in
29
+ func udpSend(textToSend: String, address: String, port: CUnsignedShort) {
30
+
31
+ let fd = socket(AF_INET, SOCK_DGRAM, 0) // DGRAM makes it UDP
32
+ var sendtext = textToSend
43
- var ptr = unsafeBitCast(addr, to: sockaddr.self)
33
+ var addr = getaddrinfo(address: address, port: port)
34
+ print(addr.sin_addr ,",", addr.sin_port)
35
+
36
+ withUnsafeMutablePointer(to: &sendtext) { textp in
37
+ let cstr = UnsafeRawPointer(textp)
44
- withUnsafePointer(to: &ptr){addrptr -> Void in
38
+ withUnsafePointer(to: &addr){sockaddrInPtr in
39
+
40
+ sockaddrInPtr.withMemoryRebound(to: sockaddr.self, capacity: 1){ sockaddrPtr in
45
- sendto(fd, cstr, Int(strlen(cstr)), 0, addrptr , socklen_t(addr.sin_len))
41
+ let check = sendto(fd, cstr, Int(strlen(sendtext)), 0, sockaddrPtr , socklen_t(MemoryLayout<sockaddr>.stride))
42
+ print(check)
43
+ print(sendtext)
44
+
45
+ }
46
46
  }
47
47
  }
48
- close(fd)
49
-
50
- }
51
48
  ```
52
49
 
53
50
  ###試したこと