質問編集履歴

3

表記の改善

2017/11/13 01:57

投稿

hyu_sy
hyu_sy

スコア7

test CHANGED
File without changes
test CHANGED
@@ -66,9 +66,7 @@
66
66
 
67
67
  var addr = getaddrinfo(address: address, port: port)
68
68
 
69
- print(addr.sin_addr ,",", addr.sin_port)
70
69
 
71
-
72
70
 
73
71
  withUnsafeMutablePointer(to: &sendtext) { textp in
74
72
 
@@ -76,17 +74,11 @@
76
74
 
77
75
  withUnsafePointer(to: &addr){sockaddrInPtr in
78
76
 
79
-
80
-
81
77
  sockaddrInPtr.withMemoryRebound(to: sockaddr.self, capacity: 1){ sockaddrPtr in
82
78
 
83
79
  let check = sendto(fd, cstr, Int(strlen(sendtext)), 0, sockaddrPtr , socklen_t(MemoryLayout<sockaddr>.stride))
84
80
 
85
- print(check)
81
+ print(check)
86
-
87
- print(sendtext)
88
-
89
-
90
82
 
91
83
  }
92
84
 

2

```ぬけ

2017/11/13 01:57

投稿

hyu_sy
hyu_sy

スコア7

test CHANGED
File without changes
test CHANGED
@@ -21,6 +21,8 @@
21
21
  ###該当のソースコード
22
22
 
23
23
  //sockaddr_inを作る関数
24
+
25
+ ```
24
26
 
25
27
  func getaddrinfo( address: String, port: CUnsignedShort) -> sockaddr_in{
26
28
 

1

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

2017/11/13 01:55

投稿

hyu_sy
hyu_sy

スコア7

test CHANGED
@@ -1 +1 @@
1
- Swift3 UDP Client
1
+ Swift3 UDP Client 指定ipにデータの送信ができない
test CHANGED
@@ -20,29 +20,9 @@
20
20
 
21
21
  ###該当のソースコード
22
22
 
23
- ```Swift3
23
+ //sockaddr_inを作る関数
24
24
 
25
-
26
-
27
- udpSend(textToSend: "Hello World!", address: ipAddr, port: 6666)
28
-
29
-
30
-
31
- func udpSend(textToSend: String, address: String, port: CUnsignedShort) {
25
+ func getaddrinfo( address: String, port: CUnsignedShort) -> sockaddr_in{
32
-
33
- func htons(value: CUnsignedShort) -> CUnsignedShort {
34
-
35
- return (value << 8) + (value >> 8);
36
-
37
- }
38
-
39
-
40
-
41
- let port: UInt16 = 6666
42
-
43
-
44
-
45
- //let ipAdd = "192.168.1.81"
46
26
 
47
27
  let ipOcts = address.components(separatedBy: ".")
48
28
 
@@ -54,19 +34,13 @@
54
34
 
55
35
  return val | (u32 << shiftBits)
56
36
 
57
-
58
-
59
37
  }
60
38
 
39
+ return sockaddr_in(
61
40
 
41
+ sin_len: UInt8(MemoryLayout<sockaddr_in>.stride),
62
42
 
63
- let fd = socket(AF_INET, SOCK_DGRAM, 0)
64
-
65
- var addr = sockaddr_in(
66
-
67
- sin_len: __uint8_t(MemoryLayout<sockaddr_in>.size),
68
-
69
- sin_family: sa_family_t(AF_INET),
43
+ sin_family: UInt8(AF_INET),
70
44
 
71
45
  sin_port: port.bigEndian,
72
46
 
@@ -76,27 +50,47 @@
76
50
 
77
51
  )
78
52
 
53
+ }
79
54
 
80
55
 
81
-     // 以下が問題のsendto付近です。
82
56
 
83
- textToSend.withCString { cstr -> Void in
57
+ func udpSend(textToSend: String, address: String, port: CUnsignedShort) {
84
58
 
85
- var ptr = unsafeBitCast(addr, to: sockaddr.self)
86
59
 
87
- withUnsafePointer(to: &ptr){addrptr -> Void in
88
60
 
61
+ let fd = socket(AF_INET, SOCK_DGRAM, 0) // DGRAM makes it UDP
62
+
63
+ var sendtext = textToSend
64
+
65
+ var addr = getaddrinfo(address: address, port: port)
66
+
67
+ print(addr.sin_addr ,",", addr.sin_port)
68
+
69
+
70
+
71
+ withUnsafeMutablePointer(to: &sendtext) { textp in
72
+
73
+ let cstr = UnsafeRawPointer(textp)
74
+
75
+ withUnsafePointer(to: &addr){sockaddrInPtr in
76
+
77
+
78
+
79
+ sockaddrInPtr.withMemoryRebound(to: sockaddr.self, capacity: 1){ sockaddrPtr in
80
+
89
- sendto(fd, cstr, Int(strlen(cstr)), 0, addrptr , socklen_t(addr.sin_len))
81
+ let check = sendto(fd, cstr, Int(strlen(sendtext)), 0, sockaddrPtr , socklen_t(MemoryLayout<sockaddr>.stride))
82
+
83
+ print(check)
84
+
85
+ print(sendtext)
86
+
87
+
88
+
89
+ }
90
90
 
91
91
  }
92
92
 
93
93
  }
94
-
95
- close(fd)
96
-
97
-
98
-
99
- }
100
94
 
101
95
  ```
102
96