source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecs/rpc/tSocketClient.c@ 388

Last change on this file since 388 was 388, checked in by coas-nagasima, 5 years ago

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 9.0 KB
Line 
1/*
2 * TECS Generator
3 * Generator for TOPPERS Embedded Component System
4 *
5 * Copyright (C) 2008-2013 by TOPPERS Project
6 *--
7 * 上記著作権者
8は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再é…
11å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再é…
17å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
18å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
19 * 者
20マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
25 * と.
26 * (a) 再é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
28マニュアルなど)に,上記の著
29 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
30 * (b) 再é…
31å¸ƒã®å½¢æ…
32‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
33 * 報告すること.
34 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
35 * 害からも,上記著作権者
36およびTOPPERSプロジェクトをå…
37è²¬ã™ã‚‹ã“と.
38 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
39 * 由に基づく請求からも,上記著作権者
40およびTOPPERSプロジェクトを
41 * å…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
47 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
48 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
49 * の責任を負わない.
50 *
51 * $Id: tSocketClient.c 388 2019-05-22 11:25:18Z coas-nagasima $
52 */
53
54/* #[<PREAMBLE>]#
55 * Don't edit the comments between #[<...>]# and #[</...>]#
56 * These comment are used by tecsmerege when merging.
57 *
58 * attr access macro #_CAAM_#
59 * portNo int16_t ATTR_portNo
60 * serverAddr char_t* ATTR_serverAddr
61 * sd int_t VAR_sd
62 *
63 * #[</PREAMBLE>]# */
64
65#include "tSocketClient_tecsgen.h"
66
67#include <errno.h>
68#include <fcntl.h>
69#include <sys/socket.h>
70#include <sys/types.h>
71#include <arpa/inet.h>
72#include <unistd.h>
73#include "errno2ER.h"
74
75#ifndef E_OK
76#define E_OK 0 /* 正常終了 */
77#define E_ID (-18) /* 不正ID番号 */
78#endif
79
80/* 受け口関数 #_TEPF_# */
81/* #[<ENTRY_PORT>]# eC0
82 * entry port: eC0
83 * signature: sChannel
84 * context: task
85 * #[</ENTRY_PORT>]# */
86
87/* #[<ENTRY_FUNC>]# eC0_send
88 * name: eC0_send
89 * global_name: tSocketClient_eC0_send
90 * oneway: false
91 * #[</ENTRY_FUNC>]# */
92ER
93eC0_send(CELLIDX idx, const int8_t* buf, int16_t size, TMO tmo)
94{
95 ER ercd = E_OK;
96 CELLCB *p_cellcb;
97 ssize_t sz;
98
99 if (VALID_IDX(idx)) {
100 p_cellcb = GET_CELLCB(idx);
101 }
102 else {
103 return(E_ID);
104 }
105
106 /* ここに処理本体を記述します */
107 // mikan BUG buf の位置を更新していない
108 while(size>0){
109 if((sz=write( VAR_sd, buf, (ssize_t)size )) < 0 ){
110#ifdef RPC_DEBUG
111 perror( "eC0_send" );
112 syslog( LOG_INFO, "eC0_send: sd %d, writing %d bytes, ercd=%d", VAR_sd, size, ercd );
113#endif
114 ercd = errno2ER( errno );
115 break;
116 }
117 else{
118 size -= sz;
119 }
120 }
121
122 return(ercd);
123}
124
125/* #[<ENTRY_FUNC>]# eC0_flush
126 * name: eC0_flush
127 * global_name: tSocketClient_eC0_flush
128 * oneway: false
129 * #[</ENTRY_FUNC>]# */
130ER
131eC0_flush(CELLIDX idx, TMO tmo)
132{
133 ER ercd = E_OK;
134 CELLCB *p_cellcb;
135 if (VALID_IDX(idx)) {
136 p_cellcb = GET_CELLCB(idx);
137 }
138 else {
139 return(E_ID);
140 }
141
142 /* ここに処理本体を記述します */
143 /* write はバッファリングなしなので flush しない */
144
145 return(ercd);
146}
147
148/* #[<ENTRY_FUNC>]# eC0_receive
149 * name: eC0_receive
150 * global_name: tSocketClient_eC0_receive
151 * oneway: false
152 * #[</ENTRY_FUNC>]# */
153ER_UINT
154eC0_receive(CELLIDX idx, int8_t* buf, int16_t size, TMO tmo)
155{
156 ER ercd = E_OK;
157 CELLCB *p_cellcb;
158 ssize_t sz;
159 if (VALID_IDX(idx)) {
160 p_cellcb = GET_CELLCB(idx);
161 }
162 else {
163 return(E_ID);
164 }
165
166 /* ここに処理本体を記述します */
167 sz = read( VAR_sd, buf, (ssize_t)size );
168 ercd = errno2ER( errno );
169#ifdef DEBUG
170 {
171 int i;
172 for( i = 0; i < sz; i++ ){
173 printf( "%02X ", (unsigned char)buf[i] );
174 if( i % 8 == 7 )
175 putchar( '\n' );
176 }
177 putchar( '\n' );
178 }
179#endif
180 /* mikan 一発でå…
181¨ã¦èª­ã‚ã‚‹ã¨ä»®å®š */
182 if( sz >= 0 )
183 ercd = sz;
184
185 return(ercd);
186}
187
188/* #[<ENTRY_FUNC>]# eC0_end_receive
189 * name: eC0_end_receive
190 * global_name: tSocketClient_eC0_end_receive
191 * oneway: false
192 * #[</ENTRY_FUNC>]# */
193ER
194eC0_end_receive(CELLIDX idx)
195{
196 ER ercd = E_OK;
197 CELLCB *p_cellcb;
198 if (VALID_IDX(idx)) {
199 p_cellcb = GET_CELLCB(idx);
200 }
201 else {
202 return(E_ID);
203 }
204
205 /* ここに処理本体を記述します #_TEFB_# */
206
207 return(ercd);
208}
209
210/* #[<ENTRY_FUNC>]# eC0_reset
211 * name: eC0_reset
212 * global_name: tSocketClient_eC0_reset
213 * oneway: false
214 * #[</ENTRY_FUNC>]# */
215ER
216eC0_reset(CELLIDX idx)
217{
218 ER ercd = E_OK;
219 CELLCB *p_cellcb;
220 if (VALID_IDX(idx)) {
221 p_cellcb = GET_CELLCB(idx);
222 }
223 else {
224 return(E_ID);
225 }
226
227 /* ここに処理本体を記述します */
228
229 return(ercd);
230}
231
232/* #[<ENTRY_PORT>]# eOpener
233 * entry port: eOpener
234 * signature: sSocketClientOpener
235 * context: task
236 * #[</ENTRY_PORT>]# */
237
238/* #[<ENTRY_FUNC>]# eOpener_open
239 * name: eOpener_open
240 * global_name: tSocketClient_eOpener_open
241 * oneway: false
242 * #[</ENTRY_FUNC>]# */
243ER
244eOpener_open(CELLIDX idx, const char_t* serverAddr, uint16_t portNo, TMO tmo)
245{
246 ER ercd = E_OK;
247 CELLCB *p_cellcb;
248 int soc;
249 struct sockaddr_in addr={AF_INET};
250
251 if (VALID_IDX(idx)) {
252 p_cellcb = GET_CELLCB(idx);
253 }
254 else {
255 return(E_ID);
256 }
257
258 /* ここに処理本体を記述します #_TEFB_# */
259 soc=socket(AF_INET, SOCK_STREAM, 0);
260 if(soc<0){
261 ercd = errno2ER( errno );
262 syslog( LOG_INFO, "SocketClient: socket failed");
263 return ercd;
264 }
265
266#if 0
267/* ノンブロックに変更 */
268 int flag=fcntl(soc, F_GETFL, 0);
269 if(flag<0) perror("fcntl(GET) error");
270 if(fcntl(soc, F_SETFL, flag|O_NONBLOCK)<0) perror("fcntl(NONBLOCK) error");
271#endif /* 0 */
272
273 puts( "connecting" );
274 inet_aton( serverAddr, &addr.sin_addr );
275 addr.sin_port=htons(portNo);
276 if(connect(soc, (struct sockaddr*)&addr, sizeof(addr))<0){
277 ercd = errno2ER( errno );
278 close( soc );
279 printf( "connect fail errno=%d, ercd=%d\n", errno, ercd );
280 syslog( LOG_INFO, "SocketClient: connect" );
281 return ercd;
282 }
283 VAR_sd = soc;
284
285#if 0
286 if(errno!=EINPROGRESS)
287 perror("connect error");
288 //EINPROGRESS:コネクション要求は始まったが、まだ完了していない
289
290 fd_set rmask,wmask;FD_ZERO(&rmask);FD_SET(soc,&rmask);wmask=rmask;
291 struct timeval tv={ タイムアウト時間[秒],[μ秒] };
292 int rc=select(soc+1, &rmask, &wmask, NULL, &tv);
293 if(rc<0) perror("connect-select error");
294 if(rc==0){ タイムアウト処理 }
295 if(rc==2){ //読み書きが同時に出来る場合
296#if Solaris
297 int val;
298 socklen_t len=sizeof(val);
299 if(getsockopt(soc,SOL_SOCKET,SO_ERROR, &val,&len)>=0) {
300#elif Linux
301 struct sockaddr_in name;
302 socklen_t len=sizeof(name);
303 if(getpeername(soc,(struct sockaddr*)&name,&len)>=0) {
304#endif
305 // 既にデータが来ている
306 }else{
307 // コネクト失敗
308 }
309 }
310 }
311//フラグをå…
312ƒã«æˆ»ã™
313 if(fcntl(soc, F_SETFL, flag)<0) perror("fcntl(END) error");
314#endif /* 0 */
315
316 return(ercd);
317}
318
319/* #[<ENTRY_FUNC>]# eOpener_simpleOpen
320 * name: eOpener_simpleOpen
321 * global_name: tSocketClient_eOpener_simpleOpen
322 * oneway: false
323 * #[</ENTRY_FUNC>]# */
324ER
325eOpener_simpleOpen(CELLIDX idx, TMO tmo)
326{
327 ER ercd = E_OK;
328 CELLCB *p_cellcb;
329 if (VALID_IDX(idx)) {
330 p_cellcb = GET_CELLCB(idx);
331 }
332 else {
333 return(E_ID);
334 } /* end if VALID_IDX(idx) */
335
336 /* Put statements here #_TEFB_# */
337 ercd = eOpener_open(idx, ATTR_serverAddr, ATTR_portNo, tmo);
338
339 return(ercd);
340}
341
342/* #[<ENTRY_FUNC>]# eOpener_close
343 * name: eOpener_close
344 * global_name: tSocketClient_eOpener_close
345 * oneway: false
346 * #[</ENTRY_FUNC>]# */
347ER
348eOpener_close(CELLIDX idx, TMO tmo)
349{
350 ER ercd = E_OK;
351 CELLCB *p_cellcb;
352 if (VALID_IDX(idx)) {
353 p_cellcb = GET_CELLCB(idx);
354 }
355 else {
356 return(E_ID);
357 }
358
359 /* ここに処理本体を記述します #_TEFB_# */
360 close( VAR_sd ); /* mikan エラー処理 */
361
362 return(ercd);
363}
364
365/* #[<POSTAMBLE>]#
366 * Put non-entry functions below.
367 * #[</POSTAMBLE>]#*/
Note: See TracBrowser for help on using the repository browser.