8c2952457
김태훈
응용 프로그램 추가
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/*
* tipc_stream_stream.c
*
* Created on: 2015. 9. 3.
* Author: jwjw
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.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 <sys/un.h>
#include <sys/socket.h>
#include <sys/poll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <linux/tipc.h>
#include <util.h>
#include <tlist.h>
#include <pollmng.h>
#include <tipc.h>
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
32
|
/// tcp 소켓의 형태를 구분한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
33
34
35
|
#define SOCK_TYPE_CLIENT 0
#define SOCK_TYPE_SERVER 1
#define SOCK_TYPE_SERVER_CLIENT 2
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
36
|
/// tcp 개별 구조체
|
8c2952457
김태훈
응용 프로그램 추가
|
37
38
39
40
|
typedef struct {
int type;
int inst;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
41
|
// 서버용 정보
|
8c2952457
김태훈
응용 프로그램 추가
|
42
43
44
|
tlist *client_list;
int client_max;
int sock_type;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
45
|
poll_obj_t *obj_server; // 서버에서 분리된 클라이언트를 위해
|
8c2952457
김태훈
응용 프로그램 추가
|
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
} tipc_stream_priv_t;
poll_obj_t *tipc_stream_open_server( int type, int inst, int client_max)
{
struct sockaddr_tipc server_addr;
server_addr.family = AF_TIPC;
server_addr.addrtype = TIPC_ADDR_NAMESEQ;
server_addr.addr.nameseq.type = type;
server_addr.addr.nameseq.lower = inst;
server_addr.addr.nameseq.upper = inst;
server_addr.scope = TIPC_ZONE_SCOPE;
int sockfd = socket (AF_TIPC, SOCK_STREAM, 0);
if ( sockfd < 0 ){
perror( "tipc server open error:" );
return NULL;
}
if (0 != bind( sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr))) {
perror("tipc bind error :");
close( sockfd );
return NULL;
}
if (0 != listen( sockfd, 0)) {
perror("tipc listen error :");
close( sockfd );
return NULL;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
78
|
// tcp 만의 정보를 설정한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
79
80
81
82
83
84
85
|
tipc_stream_priv_t *tipc = (tipc_stream_priv_t *)malloc( sizeof(tipc_stream_priv_t) );
tipc->sock_type = SOCK_TYPE_SERVER;
tipc->type = type;
tipc->inst = inst;
tipc->client_max = client_max;
tipc->client_list = tlist_create();
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
86
|
// 폴관리객체에 등록한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
poll_obj_t *obj = poll_add( sockfd );
obj->type = STYP_TIPC;
obj->priv = (void *)tipc;
poll_rebuild();
return obj;
}
poll_obj_t *tipc_stream_open_client( int type, int inst )
{
struct sockaddr_tipc server_addr;
server_addr.family = AF_TIPC;
server_addr.addrtype = TIPC_ADDR_NAME;
server_addr.addr.name.name.type = type;
server_addr.addr.name.name.instance = inst;
server_addr.addr.name.domain = 0;
int sockfd = socket (AF_TIPC, SOCK_STREAM, 0);
if ( sockfd < 0 ){
perror( "tipc open error:" );
return NULL;
}
if ( 0 != connect( sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) ) {
perror( "tipc connect error :" );
close( sockfd );
return NULL;
}
poll_obj_t *obj;
tipc_stream_priv_t *tipc = (tipc_stream_priv_t *)malloc( sizeof(tipc_stream_priv_t) );
tipc->sock_type = SOCK_TYPE_CLIENT;
tipc->type = type;
tipc->inst = inst;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
126
|
// 폴관리객체에 등록한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
127
128
129
130
131
132
133
134
|
obj = poll_add( sockfd );
obj->type = STYP_TIPC;
obj->priv = (void *)tipc;
return obj;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
135
136
|
/** @brief tcp 소켓을 close 한다.
@param obj 폴객체 포인터
|
8c2952457
김태훈
응용 프로그램 추가
|
137
138
139
140
|
*///----------------------------------------------------------------------------
void tipc_stream_close( poll_obj_t *obj )
{
tipc_stream_priv_t *tipc, *server_tipc;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
141
|
if ( obj->on_disconnect ){ // 소켓 끊어짐을 사용자에게 알린다.
|
8c2952457
김태훈
응용 프로그램 추가
|
142
143
144
145
146
147
148
|
obj->on_disconnect( obj );
}
tipc = (tipc_stream_priv_t *)obj->priv;
switch( tipc->sock_type )
{
case SOCK_TYPE_SERVER_CLIENT :
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
149
|
// 서버가 관리하는 클라이언트를 리스트에서 삭제
|
8c2952457
김태훈
응용 프로그램 추가
|
150
151
152
153
154
155
|
server_tipc = (tipc_stream_priv_t *)(tipc->obj_server->priv);
if ( server_tipc ){
tlist_remove( server_tipc->client_list, obj );
}
break;
case SOCK_TYPE_SERVER :
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
156
|
tlist_free( tipc->client_list ); // 서버가 관리하는 클라이언트의 server_tipc 를 모두 NULL 로 만든다.
|
8c2952457
김태훈
응용 프로그램 추가
|
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
break;
}
shutdown( obj->fd, SHUT_RDWR);
close( obj->fd );
if ( obj->priv ){
free( obj->priv );
}
poll_delete( obj );
}
static poll_obj_t *tipc_stream_connect_client( poll_obj_t *obj_server, int sockfd)
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
172
|
// 클라이언트 접속의 개수를 파악한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
173
174
175
176
177
178
179
180
|
tipc_stream_priv_t *server_tipc = (tipc_stream_priv_t *)obj_server->priv;
if ( tlist_getcount(server_tipc->client_list) >= server_tipc->client_max ){
shutdown(sockfd, SHUT_RDWR);
close( sockfd );
printf( "tipc connect error : client is full (%d)
", server_tipc->client_max );
return NULL;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
181
|
// tipc 만의 정보를 설정한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
182
183
184
|
tipc_stream_priv_t *tipc = (tipc_stream_priv_t *)malloc( sizeof(tipc_stream_priv_t) );
tipc->sock_type = SOCK_TYPE_SERVER_CLIENT;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
185
|
tipc->obj_server = obj_server; // 클라이언트 소켓을 할당한 서버정보
|
8c2952457
김태훈
응용 프로그램 추가
|
186
|
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
187
|
// 폴관리객체에 등록한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
188
189
|
poll_obj_t *obj = poll_add( sockfd );
if ( obj ){
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
190
|
// 서버에 접속된 클라이언트를 리스트에 등록
|
8c2952457
김태훈
응용 프로그램 추가
|
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
|
tlist_add( server_tipc->client_list, obj );
obj->type = STYP_TIPC;
obj->priv = (void *)tipc;
return obj;
} else {
shutdown(sockfd, SHUT_RDWR);
close( sockfd );
free( tipc );
return NULL;
}
}
poll_obj_t *tipc_stream_accept_client( poll_obj_t *obj_server )
{
int peer_sd = accept( obj_server->fd, 0, 0);
if (peer_sd < 0 ) {
printf ("Server: accept failed
");
exit(1);
}
return tipc_stream_connect_client( obj_server, peer_sd);
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
218
219
220
221
222
223
224
225
|
/** @brief tipc 소켓을 통해 데이타를 전송한다.
@param obj 폴객체 포인터
@param buf 전송버퍼
@param len 버퍼의 길이
@return 전송한 데이타 개수
@remark 에러에 대한 처리를 해야한다.
tipc_stream_close( obj ) 를 호출하여 접속을 끊는 방법이 일반적이다.
BF_POLICY_AUTO_CLOSE 옵션이 있을경우 자동으로 소켓을 닫는다.
|
8c2952457
김태훈
응용 프로그램 추가
|
226
227
228
229
230
231
232
233
234
235
236
237
238
239
|
*///----------------------------------------------------------------------------
int tipc_stream_write( poll_obj_t *obj, char *buf, int len )
{
int wrcnt = write( obj->fd, buf, len );
if ( 0 > wrcnt ){
perror( "[sys]tipc send error:" );
tipc_stream_close( obj );
}
return wrcnt;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
240
241
242
243
244
245
246
|
/** @brief tipc 소켓을 통해 데이타를 읽는다.
@param obj 폴객체 포인터
@param len 버퍼의 길이
@return 전송된 데이타 개수
@remark 에러에 대한 처리를 해야한다.
tipc_stream_close( obj ) 를 호출하여 접속을 끊는 방법이 일반적이다.
BF_POLICY_AUTO_CLOSE 옵션이 있을경우 자동으로 소켓을 닫는다.
|
8c2952457
김태훈
응용 프로그램 추가
|
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
*///----------------------------------------------------------------------------
int tipc_stream_read( poll_obj_t *obj, char *buf, int len )
{
int rdcnt = read( obj->fd, buf, len );
if ( 0 > rdcnt ) {
perror( "tipc recv error:" );
tipc_stream_close( obj );
} else if ( 0 == rdcnt ){
if ( 0 > errno ){
perror( "tipc recv error:" );
tipc_stream_close( obj );
} else {
tipc_stream_close( obj );
}
}
return rdcnt;
}
|