8c2952457
김태훈
응용 프로그램 추가
|
1
2
3
|
/**
@file uds.c
@date 2009-03-19
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
4
5
|
@author 오재경 freefrug@falinux.com
@brief uds 를 사용한 통신을 담당한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
6
|
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
7
8
9
10
|
@modify 2009-12-11 (오재경)
uds_open_client() 함수에 대한 편의성을 가미했다.
uds_open_client() 함수 호출시 인자의 파일이름은 uds_write() 함수에서
목적지가 NULL 일 경우 목적지로 대치된다.
|
8c2952457
김태훈
응용 프로그램 추가
|
11
12
13
14
15
16
17
|
@todo
@bug
@remark
@warning
*/
//
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
18
19
|
// 저작권 에프에이리눅스(주)
// 외부공개 금지
|
8c2952457
김태훈
응용 프로그램 추가
|
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
//
//----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pollmng.h>
#include <uds.h>
char desc_uds[] = "falinux uds ver 0.2.0";
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
40
|
/// uds 개별 구조체
|
8c2952457
김태훈
응용 프로그램 추가
|
41
42
43
44
45
46
47
|
typedef struct {
char port[256];
int im_server;
} uds_priv_t;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
48
|
static poll_obj_t *tmp_uds_poll = NULL; // poll 관리객체없이 전송함수를 위해
|
8c2952457
김태훈
응용 프로그램 추가
|
49
50
51
|
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
52
53
54
|
/** @brief uds 소켓을 서버형태로 open 한다.
@param fname 문자열 파일이름
@return poll_obj_t 형태의 포인터
|
8c2952457
김태훈
응용 프로그램 추가
|
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
*///----------------------------------------------------------------------------
poll_obj_t *uds_open_server( char *fname )
{
struct sockaddr_un addr_svr;
poll_obj_t *obj;
uds_priv_t *uds;
int option;
int sockfd;
sockfd = socket( AF_UNIX, SOCK_DGRAM, 0 );
if ( sockfd < 0 )
{
perror( "uds open error:" );
return NULL;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
71
|
// 이미 소켓용 화일에 링크되어 있다면 제거한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
72
73
|
unlink ( fname );
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
74
75
|
// TIME-WAIT 상태에 있는 소켓에 할당되어 있는 IP 주소와 포트를 바로 사용할 수 있도록
// SO_REUSEADDR 의 옵션 값을 TRUE 로
|
8c2952457
김태훈
응용 프로그램 추가
|
76
77
78
|
option = 1;
setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
79
|
// 소켓을 시스템에 연결한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
80
81
82
83
84
85
86
87
88
89
90
|
bzero( &addr_svr, sizeof(struct sockaddr_un) );
addr_svr.sun_family = AF_UNIX;
strcpy( addr_svr.sun_path, fname );
if( bind( sockfd, (struct sockaddr *)&addr_svr, sizeof(struct sockaddr_un) ) < 0 )
{
perror("uds bind error :");
close( sockfd );
return NULL;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
91
|
// uds 만의 정보를 설정한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
92
93
94
95
96
97
98
99
100
101
102
103
104
|
uds = (uds_priv_t *)malloc( sizeof(uds_priv_t) );
uds->im_server = 1;
strcpy( uds->port, fname );
obj = poll_add( sockfd );
obj->type = STYP_UDS;
obj->priv = (void *)uds;
tmp_uds_poll = obj;
return obj;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
105
106
107
|
/** @brief uds 소켓을 클라이언트 형태로 open 한다.
@param fname 문자열 파일이름, 확장을 위해 존재하며 NULL 을 사용하여도 된다.
@return poll_obj_t 형태의 포인터
|
8c2952457
김태훈
응용 프로그램 추가
|
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
*///----------------------------------------------------------------------------
poll_obj_t *uds_open_client( char *fname )
{
poll_obj_t *obj;
uds_priv_t *uds;
int sockfd;
sockfd = socket( AF_UNIX, SOCK_DGRAM, 0 );
if ( sockfd < 0 )
{
perror( "uds open error:" );
return NULL;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
122
|
// uds 만의 정보를 설정한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
uds = (uds_priv_t *)malloc( sizeof(uds_priv_t) );
uds->im_server = 0;
if (fname)
{
strcpy( uds->port, fname );
}
obj = poll_add( sockfd );
obj->type = STYP_UDS;
obj->priv = (void *)uds;
tmp_uds_poll = obj;
return obj;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
139
140
|
/** @brief uds 소켓을 close 한다.
@param obj 폴객체 포인터
|
8c2952457
김태훈
응용 프로그램 추가
|
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
*///----------------------------------------------------------------------------
void uds_close( poll_obj_t *obj )
{
close( obj->fd );
if ( obj->priv )
{
free( obj->priv );
}
poll_delete( obj );
if ( tmp_uds_poll == obj ) tmp_uds_poll = NULL;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
156
157
158
|
/** @brief uds 폴객체를 파일이름으로 찾는다.
@param fname 문자열 파일이름
@return obj 폴객체 포인터
|
8c2952457
김태훈
응용 프로그램 추가
|
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
*///----------------------------------------------------------------------------
poll_obj_t *uds_get_byport( char *fname )
{
poll_obj_t *obj;
uds_priv_t *uds;
int idx, count;
count = poll_count();
for(idx=0; idx<count; idx++)
{
obj = poll_get_obj( idx );
uds = (uds_priv_t *)obj->priv;
if ( uds )
{
if ( 0 == strcmp( uds->port, fname ) )
{
return obj;
}
}
}
return NULL;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
184
185
186
187
188
189
|
/** @brief uds 소켓을 통해 데이타를 전송한다.
@param obj 폴객체 포인터
@param to 상대방 파일이름 문자열포인터
@param buf 전송버퍼
@param len 버퍼의 길이
@return 전송한 데이타 개수
|
8c2952457
김태훈
응용 프로그램 추가
|
190
191
192
193
194
195
196
197
198
199
|
*///----------------------------------------------------------------------------
int uds_write( poll_obj_t *obj, char *to, char *buf, int len )
{
uds_priv_t *uds;
struct sockaddr_un uds_addr;
char *dst;
int wrcnt;
uds = (uds_priv_t *)obj->priv;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
200
|
// 클라이언트로 열려있거나 목적지가 존재하지 않으면 저장된 포트로 전송한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
201
202
203
204
205
206
|
dst = to;
if ( ( 0 == uds->im_server ) && ( NULL == dst ) )
{
dst = uds->port;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
207
|
// 상대편 주소를 설정한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
208
209
210
211
|
bzero( &uds_addr, sizeof(struct sockaddr_un) );
uds_addr.sun_family = AF_UNIX;
strcpy( uds_addr.sun_path, dst );
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
212
|
// 전송한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
213
214
215
216
217
218
219
220
221
222
223
224
225
|
wrcnt = sendto( obj->fd, buf, len, 0, (struct sockaddr *)&uds_addr, sizeof(uds_addr) );
if ( 0 > wrcnt )
{
char msg[256];
sprintf( msg, "uds send error(to %s)", dst );
perror( msg );
}
return wrcnt;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
226
227
228
229
230
|
/** @brief uds 소켓을 통해 데이타를 읽는다.
@param obj 폴객체 포인터
@param buf 전송버퍼
@param len 버퍼의 길이
@return 전송된 데이타 개수
|
8c2952457
김태훈
응용 프로그램 추가
|
231
232
233
234
235
236
237
|
*///----------------------------------------------------------------------------
int uds_read( poll_obj_t *obj, char *buf, int len )
{
struct sockaddr_un uds_addr;
int addr_len;
int rdcnt;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
238
|
// 데이타를 읽는다.
|
8c2952457
김태훈
응용 프로그램 추가
|
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
|
addr_len = sizeof(uds_addr);
rdcnt = recvfrom( obj->fd, buf, len, 0, (struct sockaddr *)&uds_addr, (socklen_t *)&addr_len );
if ( 0 > rdcnt )
{
perror( "uds recv error:" );
}
//else
//{
// if ( from ) strcpy( from, uds_addr.sun_path );
//}
return rdcnt;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
255
256
257
258
259
260
|
/** @brief poll 객체없이 uds 소켓을 통해 데이타를 전송한다.
@param to 상대방 파일이름 문자열포인터
@param buf 전송버퍼
@param len 버퍼의 길이
@return 전송한 데이타 개수
@remark uds_open_server(), uds_open_client() 함수는 한번 호출되어야 한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
261
262
263
264
265
266
267
268
269
270
271
|
*///----------------------------------------------------------------------------
int uds_write_simple( char *to, char *buf, int len )
{
if ( tmp_uds_poll )
{
return uds_write( tmp_uds_poll, to, buf, len );
}
return -1;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
272
273
274
275
276
|
/** @brief poll 객체없이 uds 소켓을 통해 데이타를 읽는다.
@param buf 전송버퍼
@param len 버퍼의 길이
@return 전송된 데이타 개수
@remark uds_open_server(), uds_open_client() 함수는 한번 호출되어야 한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
277
278
279
280
281
282
283
284
285
286
287
288
|
*///----------------------------------------------------------------------------
int uds_read_simple( char *buf, int len )
{
if ( tmp_uds_poll )
{
return uds_read( tmp_uds_poll, buf, len );
}
return -1;
}
|