8c2952457
김태훈
응용 프로그램 추가
|
1
2
3
|
/**
@file tipc_bcast.c
@date 2015-08-31
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
4
5
|
@author 장길석 jks@falinux.com
@brief TIPC-DGRAM 소켓을 사용하여 멀티캐스트가 가능한 통신을 담당한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
6
7
8
9
10
11
12
13
14
|
@modify
@todo
@bug
@remark
@warning
*/
//
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
15
16
|
// 저작권 에프에이리눅스(주)
// 외부공개 금지
|
8c2952457
김태훈
응용 프로그램 추가
|
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
//
//----------------------------------------------------------------------------
#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 <linux/tipc.h>
#include <pollmng.h>
#include "../../include/fanet/tipc_bcast.h"
char desc_tipc_bcast[] = "falinux tipc broadcast ver 0.0.1";
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
36
|
/// tipc_bcast 개별 구조체
|
8c2952457
김태훈
응용 프로그램 추가
|
37
38
39
40
41
42
43
|
typedef struct {
int type; // server type
int lower; // port lower
int upper; // port upper
} tipc_bcast_priv_t;
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
44
45
46
|
/** @brief tipc_bcast 소켓을 서버형태로 open 한다.
@param port 포트번호
@return poll_obj_t 형태의 포인터
|
8c2952457
김태훈
응용 프로그램 추가
|
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
|
*///----------------------------------------------------------------------------
poll_obj_t *tipc_bcast_open( int type, int lower, int upper )
{
struct sockaddr_tipc server_addr;
server_addr.family = AF_TIPC;
server_addr.addrtype = TIPC_ADDR_NAMESEQ;
server_addr.scope = TIPC_CLUSTER_SCOPE;
server_addr.addr.nameseq.type = type;
server_addr.addr.nameseq.lower = lower;
server_addr.addr.nameseq.upper = upper;
int sockfd = socket (AF_TIPC, SOCK_RDM, 0);
if ( bind( sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr))) {
printf("Server: port {%u,%u,%u} could not be created
",
type, lower, upper);
close( sockfd );
return NULL;
}
tipc_bcast_priv_t *tipc_bcast;
poll_obj_t *obj;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
72
|
// tipc_bcast 만의 정보를 설정한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
73
74
75
76
77
78
79
80
81
82
83
84
85
|
tipc_bcast = (tipc_bcast_priv_t *)malloc( sizeof(tipc_bcast_priv_t) );
tipc_bcast->type = type;
tipc_bcast->lower = lower;
tipc_bcast->upper = upper;
obj = poll_add( sockfd );
obj->type = STYP_TIPC_DGRAM;
obj->priv = (void *)tipc_bcast;
return obj;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
86
87
|
/** @brief tipc_bcast 소켓을 close 한다.
@param obj 폴객체 포인터
|
8c2952457
김태훈
응용 프로그램 추가
|
88
89
90
91
92
93
94
95
96
97
98
99
|
*///----------------------------------------------------------------------------
void tipc_bcast_close( poll_obj_t *obj )
{
close( obj->fd );
if ( obj->priv ){
free( obj->priv );
}
poll_delete( obj );
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
100
101
102
103
104
105
106
|
/** @brief tipc_bcast 소켓을 통해 데이타를 전송한다.
@param obj 폴객체 포인터
@param host 상대방 IP 나 호스트이름 문자열포인터
@param port 상대방 포트번호
@param buf 전송버퍼
@param len 버퍼의 길이
@return 전송한 데이타 개수
|
8c2952457
김태훈
응용 프로그램 추가
|
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
*///----------------------------------------------------------------------------
int tipc_bcast_write( poll_obj_t *obj, int type, int lower, int upper, char *buf, int len )
{
struct sockaddr_tipc server_addr;
server_addr.family = AF_TIPC;
server_addr.addrtype = TIPC_ADDR_MCAST;
server_addr.addr.nameseq.type = type;
server_addr.addr.nameseq.lower = lower;
server_addr.addr.nameseq.upper = upper;
int wrcnt = sendto( obj->fd, buf, len, 0,
(struct sockaddr *)&server_addr, sizeof( server_addr));
return wrcnt;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
124
125
126
127
|
/** @brief tipc_bcast 소켓을 통해 데이타를 읽는다.
@param obj 폴객체 포인터
@param len 버퍼의 길이
@return 전송된 데이타 개수
|
8c2952457
김태훈
응용 프로그램 추가
|
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
*///----------------------------------------------------------------------------
int tipc_bcast_read( poll_obj_t *obj, char *buf, int len )
{
struct sockaddr_tipc client_addr;
socklen_t alen = sizeof(struct sockaddr_tipc);
int rdcnt = recvfrom( obj->fd, buf, len, 0,
(struct sockaddr *)&client_addr, &alen);
if ( 0 > rdcnt ){
perror( "tipc_bcast recv error:" );
}
return rdcnt;
}
|