summaryrefslogtreecommitdiff
path: root/src/support/socket
diff options
context:
space:
mode:
authorlishu <[email protected]>2018-09-29 14:25:18 +0800
committerlishu <[email protected]>2018-09-29 14:25:18 +0800
commit4ac33d9d46da16f249523cdb930d0831dd1b57b1 (patch)
tree61e54a64de7447bb929b242efe110fc4eb83b037 /src/support/socket
20180929 create
Diffstat (limited to 'src/support/socket')
-rw-r--r--src/support/socket/bin/libmy_socket.abin0 -> 20100 bytes
-rw-r--r--src/support/socket/bin/libmy_socket.sobin0 -> 19372 bytes
-rw-r--r--src/support/socket/src/Makefile42
-rw-r--r--src/support/socket/src/libmy_socket.abin0 -> 20100 bytes
-rw-r--r--src/support/socket/src/my_socket.c280
-rw-r--r--src/support/socket/src/my_socket.h28
-rw-r--r--src/support/socket/src/my_socket.obin0 -> 19584 bytes
7 files changed, 350 insertions, 0 deletions
diff --git a/src/support/socket/bin/libmy_socket.a b/src/support/socket/bin/libmy_socket.a
new file mode 100644
index 0000000..938e865
--- /dev/null
+++ b/src/support/socket/bin/libmy_socket.a
Binary files differ
diff --git a/src/support/socket/bin/libmy_socket.so b/src/support/socket/bin/libmy_socket.so
new file mode 100644
index 0000000..d2066a0
--- /dev/null
+++ b/src/support/socket/bin/libmy_socket.so
Binary files differ
diff --git a/src/support/socket/src/Makefile b/src/support/socket/src/Makefile
new file mode 100644
index 0000000..2e770aa
--- /dev/null
+++ b/src/support/socket/src/Makefile
@@ -0,0 +1,42 @@
+LIB_PATH=./
+SRC=./
+OBJ=./
+INCLUDE=-I ./inc
+INCLUDE+=-I /usr/include/MESA/
+
+LIB=-L./lib -lsitdc++ -lpthread
+CC=g++ -g
+
+G_FLAG_SO = -Wall -fPIC $(INCLUDE)
+G_FLAG = -Wall $(INCLUDE)
+
+SRCFILE= $(wildcard $(SRC)*.c)
+DETACHDIR= $(notdir $(SRCFILE))
+OBJECTS = $(patsubst %.c, $(OBJ)%.o, $(DETACHDIR))
+
+TARGETLIB = $(LIB_PATH)libmy_socket.a
+TARGETSO = $(LIB_PATH)libmy_socket.so
+
+
+$(OBJ)%.o:$(SRC)%.c
+ $(CC) -c -o $@ $(G_FLAG_SO) $<
+
+all:$(TARGETLIB)
+#all:$(TARGETSO)
+
+$(TARGETLIB):$(OBJECTS)
+ ar rs $@ $^
+ cp $@ ../bin/
+ cp $@ ../../../lib/
+ cp my_socket.h ../../../inc/
+$(TARGETSO):$(OBJECTS)
+ $(CC) -o $@ $(G_FLAG) -shared $^
+ cp $@ ../bin/
+ cp $@ ../../../lib/
+ cp my_socket.h ../../../inc/
+clean:
+ -rm -rf $(OBJECTS) $(TARGETSO) $(TARGETLIB) *.o
+install:
+ cp *.a ../../../lib/
+
+.PHONY:all clean
diff --git a/src/support/socket/src/libmy_socket.a b/src/support/socket/src/libmy_socket.a
new file mode 100644
index 0000000..938e865
--- /dev/null
+++ b/src/support/socket/src/libmy_socket.a
Binary files differ
diff --git a/src/support/socket/src/my_socket.c b/src/support/socket/src/my_socket.c
new file mode 100644
index 0000000..4ccd5d0
--- /dev/null
+++ b/src/support/socket/src/my_socket.c
@@ -0,0 +1,280 @@
+// output.c
+//
+//
+//
+// MODIFIED by
+// CREATED BY Guo Le, 08/24/2010
+// use sendnto instead of sendto, [email protected] 2012-05-30
+// add Unix-domain sokcet,[email protected] 2012-06-04
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <sys/un.h>
+#include <stddef.h>//offsetof
+
+#include "my_socket.h"
+
+int init_send_udp_socket()
+{
+ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (-1 == sockfd)
+ {
+ return -1;
+ }
+ return sockfd;
+}
+
+
+void output_udp_clear(int sockfd)
+{
+ close(sockfd);
+}
+
+// send udp packet
+int send_udp_socket_send(int sockfd, uint32_t addr, uint16_t port, char *data, int datalen)
+{
+ struct sockaddr_in dst_addr; /* connector's address information */
+ dst_addr.sin_family = AF_INET; /* host byte order */
+ dst_addr.sin_port = port; /* short, network byte order */
+ dst_addr.sin_addr.s_addr = addr;
+ bzero(&(dst_addr.sin_zero), 8); /* zero the rest of the struct */
+ int to_send_len=datalen;
+ int already_sended_len=0;
+ while(to_send_len>0)
+ {
+ already_sended_len=sendto(sockfd,data,
+ to_send_len-already_sended_len,
+ 0,
+ (struct sockaddr *)&(dst_addr),
+ sizeof(dst_addr));
+ if(already_sended_len==-1)
+ {
+ if((EAGAIN == errno)||( EINTR == errno )|| (EWOULDBLOCK==errno))
+ {
+ continue;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ to_send_len-=already_sended_len;
+ }
+ return already_sended_len;
+}
+
+
+int output_udp_init_connect(uint32_t addr, uint16_t port, char *dev)
+{
+ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (-1 == sockfd) {
+ return -1;
+ }
+ struct sockaddr_in dst_addr; /* connector's address information */
+ dst_addr.sin_family = AF_INET; /* host byte order */
+ dst_addr.sin_port = port; /* short, network byte order */
+ dst_addr.sin_addr.s_addr = addr;
+ bzero(&(dst_addr.sin_zero), 8); /* zero the rest of the struct */
+
+ if (-1 == connect(sockfd, (struct sockaddr*)&dst_addr, sizeof(dst_addr)))
+ {
+ return -1;
+ }
+
+ if (dev) {
+ struct ifreq interface;
+ strncpy(interface.ifr_ifrn.ifrn_name, dev, IFNAMSIZ);
+ if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) {
+ return -1;
+ }
+ }
+
+ return sockfd;
+}
+
+void output_udp_clear_connect(int sockfd)
+{
+ close(sockfd);
+}
+
+// send udp packet
+int output_udp_send_connect(int sockfd, uint8_t *data, int datalen)
+{
+ int to_send_len=datalen;
+ int already_sended_len=0;
+ while(to_send_len>0)
+ {
+ already_sended_len= send(sockfd, data, datalen, 0);
+ if(already_sended_len==-1)
+ {
+ if((EAGAIN == errno)||( EINTR == errno )|| (EWOULDBLOCK==errno))
+ {
+ continue;
+ }
+ else
+ {
+ printf("udpout_send_connect: loss data %s\n",strerror(errno));
+ return -1;
+ }
+ }
+ to_send_len-=already_sended_len;
+ }
+ return already_sended_len;
+}
+
+void input_udp_clear(int sockfd)
+{
+ close(sockfd);
+}
+
+int init_unix_socket(const char* file_name)
+{
+ int sockfd = -1;
+ int len = 0;
+ struct sockaddr_un un;
+ struct timeval send_timeout;
+ int send_buf_size = 1024*1024*4;
+
+ if(strlen(file_name)+8>sizeof(un.sun_path))
+ {
+ printf("Unix-domain socket file name too long.\n");
+ return -1;
+ }
+ sockfd=socket(AF_UNIX,SOCK_DGRAM,0);
+ if(sockfd<0)
+ {
+ printf("Get Unix-domain socket error:%s\n",strerror(errno));
+ return -1;
+ }
+
+ send_timeout.tv_sec = 0;
+ send_timeout.tv_usec = 100000;
+ memset(&un,0,sizeof(un));
+ un.sun_family = AF_UNIX;
+ if(-1==setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,&send_timeout,sizeof(send_timeout)))
+ {
+ printf("Set Unix-domain socket error:%s\n",strerror(errno));
+ return -1;
+ }
+ if(-1==setsockopt(sockfd,SOL_SOCKET,SO_SNDBUF,&send_buf_size,sizeof(send_buf_size)))
+ {
+ printf("Set Unix-domain socket error:%s\n",strerror(errno));
+ return -1;
+ }
+ snprintf(un.sun_path,sizeof(un.sun_path),"%s",file_name);
+ len = offsetof(struct sockaddr_un, sun_path) + strlen(un.sun_path);
+ unlink(un.sun_path);
+ if(0 > bind(sockfd,(struct sockaddr*)&un,len))
+ {
+ printf("Bind Unix-domain socket error:%s\n",strerror(errno));
+ return -1;
+ }
+ return sockfd;
+}
+
+int unix_socket_send(int sockfd, struct sockaddr_un *dest_un, const char*data, int datalen)
+{
+ int to_send_len = datalen;
+ int already_sended_len = 0;
+ int sock_addr_len=offsetof(struct sockaddr_un,sun_path)+strlen(dest_un->sun_path);
+ while(to_send_len>0)
+ {
+ already_sended_len= sendto(sockfd, data, datalen,0,(struct sockaddr*)dest_un, sock_addr_len);
+ if(already_sended_len==-1)
+ {
+ return -1;
+ }
+ to_send_len -= already_sended_len;
+ }
+ return already_sended_len;
+}
+
+int init_recv_udp_socket(uint16_t port)
+{
+ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (-1 == sockfd)
+ {
+ perror("listener: socket");
+ return -1;
+ }
+ struct sockaddr_in my_addr; /* my address information */
+ my_addr.sin_family = AF_INET; /* host byte order */
+ my_addr.sin_port = port; /* short, network byte order */
+ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
+ bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
+
+ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
+ {
+ perror("listener: bind");
+ close(sockfd);
+ return -1;
+ }
+ return sockfd;
+}
+
+int recv_udp_socket_recv(int sockfd, uint32_t *src_ip, uint8_t *buf, uint32_t buf_size)
+{
+ if (NULL == buf) return -1;
+
+ int numbytes;
+ struct sockaddr_storage their_addr;
+ socklen_t addr_len = sizeof(their_addr);
+
+ if ((numbytes = recvfrom(sockfd, buf, buf_size , 0,(struct sockaddr *)&their_addr, &addr_len)) == -1)
+ {
+ perror("recvfrom");
+ return -1;
+ }
+ *src_ip = ((struct sockaddr_in *)&their_addr)->sin_addr.s_addr;
+ return numbytes;
+}
+
+int init_recv_unix_socket(const char* file_name)
+{
+ int sockfd=-1;
+ int len;
+ struct sockaddr_un un;
+ if(strlen(file_name)+8>sizeof(un.sun_path))
+ {
+ printf("Unix-domain socket file name too long.\n");
+ return -1;
+ }
+ sockfd=socket(AF_UNIX,SOCK_DGRAM,0);
+ if(sockfd<0)
+ {
+ printf("Get Unix-domain socket error:%s\n",strerror(errno));
+ return -1;
+ }
+ memset(&un,0,sizeof(un));
+ un.sun_family=AF_UNIX;
+
+ snprintf(un.sun_path,sizeof(un.sun_path),"%s",file_name);
+ len=offsetof(struct sockaddr_un,sun_path)+strlen(un.sun_path);
+ unlink(un.sun_path);
+ if(0>bind(sockfd,(struct sockaddr*)&un,len))
+ {
+ printf("Bind Unix-domain socket error:%s\n",strerror(errno));
+ return -1;
+ }
+ return sockfd;
+}
+
+int recv_unix_socket_recv(int sockfd,char*buf,int buf_len)
+{
+ int recv_len = 0;
+ struct sockaddr_storage sa;
+ socklen_t sa_len = sizeof(struct sockaddr);
+
+ recv_len = recvfrom(sockfd,buf,buf_len,0,(struct sockaddr*)&sa,&sa_len);
+ return recv_len;
+}
+
diff --git a/src/support/socket/src/my_socket.h b/src/support/socket/src/my_socket.h
new file mode 100644
index 0000000..751acf9
--- /dev/null
+++ b/src/support/socket/src/my_socket.h
@@ -0,0 +1,28 @@
+#ifndef _MY_SOCKET_H_
+#define _MY_SOCKET_H_
+
+#include <stdint.h>
+#include <sys/un.h>
+
+#define SOCKET_BUF_SIZE 1500
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int init_unix_socket(const char* file_name);
+int unix_socket_send(int sockfd, struct sockaddr_un *dest_un, const char*data, int datalen);
+int init_recv_udp_socket(uint16_t port);
+int recv_udp_socket_recv(int sockfd, uint32_t *src_ip, uint8_t *buf, uint32_t buf_size);
+int init_recv_unix_socket(const char* file_name);
+int recv_unix_socket_recv(int sockfd,char*buf,int buf_len);
+int init_send_udp_socket();
+int send_udp_socket_send(int sockfd, uint32_t addr, uint16_t port, char *data, int datalen);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/support/socket/src/my_socket.o b/src/support/socket/src/my_socket.o
new file mode 100644
index 0000000..193121d
--- /dev/null
+++ b/src/support/socket/src/my_socket.o
Binary files differ