wangzhengquan
2020-07-20 f85c9b875b060681b51f57b15074ba1c7c9f5636
update
5个文件已添加
5个文件已修改
306 ■■■■■ 已修改文件
README.md 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/Makefile 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/pub_sub 补丁 | 查看 | 原始文档 | blame | 历史
demo/pub_sub.c 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/req_rep 补丁 | 查看 | 原始文档 | blame | 历史
demo/req_rep.c 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
queue/include/mod_socket.h 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
queue/include/shm_mm.h 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
queue/include/shm_socket.h 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
queue/mod_socket.c 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md
@@ -1,8 +1,92 @@
 
## 实例
 请求应答 `./test2/server.c ./test2/client.c`
 ### 请求应答模式
 `source ./demo/server.c`
 **运行server端:**
 `./req_req server 8`
 **运行client端:**
 可以打开多个client
 `./req_rep client 8`
 在client端输入请求信息,server 端回应,client端输出回应信息
 ### 发布订阅模式
 **运行server端:**
 `./pub_sub server 8`
 **运行client端:**
 可以打开多个client
 `./pub_sub client 8`
 在server端输入发布信息,client端输出收到的订阅信息
## 接口说明
```
/**
 * 创建socket
 * @return socket地址
*/
void *mod_open_socket(int mod);
/**
 * 关闭socket
*/
int mod_close_socket(void * _socket);
/**
 * 绑定端口到socket, 如果不绑定则系统自动分配一个
 * @return 0 成功, 其他值 失败的错误码
*/
int mod_socket_bind(void * _socket, int port);
/**
 * 服务端开启连接监听
 * @return 0 成功, 其他值 失败的错误码
 */
int mod_listen(void * _socket);
/**
 * 客户端发起连接请求
 */
int mod_connect(void * _socket, int port);
/**
 * 发送信息
 * @return 0 成功, 其他值 失败的错误码
 */
int mod_send(void * _socket, const void *buf, const int size);
/**
 * 接收信息
 * @return 0 成功, 其他值 失败的错误码
*/
int mod_recv(void * _socket, void **buf, int *size) ;
/**
 * 释放接收信息的buf
 */
void mod_free(void *buf);
/**
 * 获取soket端口号
 */
int mod_get_socket_port(void * _socket);
```
 
demo/Makefile
New file
@@ -0,0 +1,32 @@
#
# Makefile for common library.
#
ROOT=..
LDLIBS+=-Wl,-rpath=$(ROOT)/queue:$(ROOT)/lib
# 开源工具包路径
LDDIR += -L$(ROOT)/queue
# 开源工具包
LDLIBS += -lshm_queue -lusgcommon -lpthread
INCLUDE += -I$(ROOT)/queue/ -I$(ROOT)/queue/include
PLATFORM=$(shell $(ROOT)/systype.sh)
include $(ROOT)/Make.defines.$(PLATFORM)
PROGS =    req_rep pub_sub
build: $(PROGS)
# test1: $(LIBCOMMON)
# 如果包A 引用包B, B 要放在 A 后面
clean:
    rm -f $(TEMPFILES) $(PROGS)
$(LIBQUEUE):
    (cd $(ROOT)/queue && $(MAKE))
demo/pub_sub
Binary files differ
demo/pub_sub.c
New file
@@ -0,0 +1,57 @@
#include "mod_socket.h"
#include "shm_mm.h"
#include "usg_common.h"
void server(int port) {
    void *socket = mod_open_socket(PUB_SUB);
    mod_socket_bind(socket, port);
    mod_listen(socket);
    int size;
    void *recvbuf;
    char sendbuf[512];
    while(true) {
        printf("请输入发布消息:");
        scanf("%s", sendbuf);
        mod_send(socket, sendbuf, strlen(sendbuf)+1) ;
        free(recvbuf);
    }
    mod_close_socket(socket);
}
void client(int port) {
    void *socket = mod_open_socket(PUB_SUB);
    mod_connect(socket, port);
    int size;
    void *recvbuf;
    while(mod_recv(socket, &recvbuf, &size) == 0) {
        printf("收到订阅消息: %s\n", (char *)recvbuf);
        free(recvbuf);
    }
    mod_close_socket(socket);
}
int main(int argc, char *argv[]) {
  shm_init(512);
  int port;
  if (argc < 3) {
       fprintf(stderr, "Usage: reqrep %s|%s <PORT> ...\n", "server", "client");
       return 1;
  }
  port = atoi(argv[2]);
  if (strcmp("server", argv[1]) == 0 ) {
     server(port);
  }
  if (strcmp("client", argv[1]) == 0)
     client(port);
 shm_destroy();
 // fprintf(stderr, "Usage: reqrep %s|%s <URL> ...\n", "server", "client");
  return 0;
}
demo/req_rep
Binary files differ
demo/req_rep.c
New file
@@ -0,0 +1,60 @@
#include "mod_socket.h"
#include "shm_mm.h"
#include "usg_common.h"
void server(int port) {
  void *socket = mod_open_socket(REQ_REP);
  mod_socket_bind(socket, port);
  mod_listen(socket);
  int size;
  void *recvbuf;
  char sendbuf[512];
  int rv;
  while ( (rv = mod_recv(socket, &recvbuf, &size) ) == 0) {
    sprintf(sendbuf, "SERVER RECEIVED: %s", recvbuf);
    puts(sendbuf);
    mod_send(socket, sendbuf, strlen(sendbuf) + 1);
    free(recvbuf);
  }
  mod_close_socket(socket);
}
void client(int port) {
  void *socket = mod_open_socket(REQ_REP);
  mod_connect(socket, port);
  int size;
  void *recvbuf;
  char sendbuf[512];
  while (true) {
    printf("request: ");
    scanf("%s", sendbuf);
    mod_send(socket, sendbuf, strlen(sendbuf) + 1);
    mod_recv(socket, &recvbuf, &size);
    printf("reply: %s\n", (char *)recvbuf);
    free(recvbuf);
  }
  mod_close_socket(socket);
}
int main(int argc, char *argv[]) {
  shm_init(512);
  int port;
  if (argc < 3) {
    fprintf(stderr, "Usage: reqrep %s|%s <PORT> ...\n", "server", "client");
    return 1;
  }
  port = atoi(argv[2]);
  if (strcmp("server", argv[1]) == 0) {
    server(port);
  }
  if (strcmp("client", argv[1]) == 0)
    client(port);
  return 0;
}
queue/include/mod_socket.h
@@ -17,25 +17,58 @@
    
};
/**
 * 创建socket
 * @return socket地址
*/
void *mod_open_socket(int mod);
/**
 * 关闭socket
*/
int mod_close_socket(void * _socket);
/**
 * 绑定端口到socket, 如果不绑定则系统自动分配一个
 * @return 0 成功, 其他值 失败的错误码
*/
int mod_socket_bind(void * _socket, int port);
 
/**
 * 服务端开启连接监听
 * @return 0 成功, 其他值 失败的错误码
 */
int mod_listen(void * _socket);
/**
 * 客户端发起连接请求
 */
int mod_connect(void * _socket, int port);
/**
 * 发送信息
 * @return 0 成功, 其他值 失败的错误码
 */
int mod_send(void * _socket, const void *buf, const int size);
/**
 * 接收信息
 * @return 0 成功, 其他值 失败的错误码
*/
int mod_recv(void * _socket, void **buf, int *size) ;
/**
 * 释放接收信息的buf
 */
void mod_free(void *buf);
/**
 * 获取soket端口号
 */
int mod_get_socket_port(void * _socket);
#ifdef __cplusplus
}
#endif
queue/include/shm_mm.h
@@ -5,11 +5,18 @@
extern "C" {
#endif
    
/**
 * 初始化共享内存
 * @size 共享内存大小, 单位M
 *
 */
void shm_init(int size);
void shm_destroy() ;
/**
 * 销毁共享内存
 * 整个进程退出时需要执行这个方法,该方法首先会检查是否还有其他进程在使用该共享内存,如果还有其他进程在使用就只是detach,如果没有其他进程在使用则销毁整块内存。
 */
void shm_destroy();
#ifdef __cplusplus
}
queue/include/shm_socket.h
@@ -52,23 +52,7 @@
} shm_socket_t;
/**
 * 初始化共享内存
 * @size 共享内存大小, 单位M
 *
 */
void shm_init(int size);
/**
 * 销毁共享内存
 * 整个进程退出时需要执行这个方法,该方法首先会检查是否还有其他进程在使用该共享内存,如果还有其他进程在使用就只是detach,如果没有其他进程在使用则销毁整块内存。
 */
void shm_destroy();
/**
 * 释放recv方法分配的buf
 */
void shm_free(void *buf);
shm_socket_t *shm_open_socket();
queue/mod_socket.c
@@ -55,6 +55,11 @@
    return rv;
}
int mod_get_socket_port(void * _socket) {
    mod_socket_t * socket = (mod_socket_t *) _socket;
    return socket->shm_socket->port;
}
int mod_socket_bind(void * _socket, int port){
    mod_socket_t * socket = (mod_socket_t *) _socket;