libsocket网络函数库
来源:互联网 发布:网络视听节目审核员 编辑:程序博客网 时间:2024/05/21 14:00
自己写的基于事件驱动模型的网络函数库,使用非常方便。
当有数据可读时,系统就会调用用户注册的函数。
当有新的客户连接时,系统就会调用用户注册的函数。
源码下载地址:https://sourceforge.net/projects/libsocketc/
测试代码如下:
#include "libsocket.h"#include <signal.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <stdbool.h>#define PORT 8888#define UDP_TEST 0#define TCP_C_TEST 1#define TCP_S_TEST 2// 修改下面的数字,选择你要测试的项目。修改后,重新执行make,即可运行test#define TEST 0bool QUIT = false;void handle(int sig){if (sig == SIGINT)QUIT = true;}// 有数据可读,将调用此函数static void readCallback(Socket *sp){int n;char buf[1024] = {0};n = readSocket(sp, buf, 1000);if (n == 0){printf("The peer had shutdown\n");return;}printf("------------------------------\n");if (TEST == UDP_TEST){printf("read from %s:%d\n", inet_ntoa(sp->pAddr.sin_addr), ntohs(sp->pAddr.sin_port));writeSocket(sp, buf, strlen(buf) + 1, W_PEER);// 向对端地址发送数据(用于UDP)//writeSocket(sp, buf, strlen(buf) + 1, W_DST);// 向指定的目标地址发送数据(用于UDP)}else if (TEST == TCP_C_TEST){printf("read from %s:%d\n", inet_ntoa(sp->dAddr.sin_addr), ntohs(sp->dAddr.sin_port));writeSocket(sp, buf, strlen(buf) + 1, 0);}else if (TEST == TCP_S_TEST){printf("read from %s:%d\n", inet_ntoa(sp->pAddr.sin_addr), ntohs(sp->pAddr.sin_port));writeSocket(sp, buf, strlen(buf) + 1, 0);}printf("%s\n", buf);}#if TEST == TCP_S_TEST// 当有新的客户连接时,将调用此函数static void callbackAccept(Socket *sp){Socket *sp_c = acceptSocket(sp, readCallback);printf("New connection:%s:%d\n", inet_ntoa(sp_c->pAddr.sin_addr), ntohs(sp_c->pAddr.sin_port));}#endifint main(int argc, char **argv){signal(SIGINT, handle);// 初始化libsocketlibSocketInit();// UDP Test#if TEST == UDP_TESTprintf("UDP Test\n");if (argc != 3){fprintf(stderr, "Usage:%s ip port\n", argv[0]);return -1;}// 创建数据报套接字Socket *sp = createSocket(SOCK_DGRAM, SOCKET_BROADCAST, readCallback);if (sp == NULL)return -1;// 指定要发送的目标地址if (connectSocket(sp, argv[1], atoi(argv[2])) < 0)return -1;// 绑定本地端口listenSocket(sp, PORT);printf("listen on %d\n", PORT);#elif TEST == TCP_C_TEST// TCP Client Testint n, fd;char buf[1024] = {0};printf("Tcp Client Test\n");if (argc != 3){fprintf(stderr, "Usage:%s ip port\n", argv[0]);return -1;}// 创建流式套接字Socket *sp = createSocket(SOCK_STREAM, 0, readCallback);if (sp == NULL)return -1;// 连接指定的服务器if (connectSocket(sp, argv[1], atoi(argv[2])) < 0)return -1;#elif TEST == TCP_S_TEST// TCP Server Testprintf("Tcp Server Test\n");// 创建流式套接字Socket *sp = createSocket(SOCK_STREAM, 0, callbackAccept);if (sp == NULL)return -1;// 绑定本地端口,并监听listenSocket(sp, 8888);printf("listen on %d\n", PORT);#endifwhile (!QUIT)sleep(1);sleep(1);// 释放libsocket资源 libSocketDeinit();printf("quit\n");return 0;}
1 0
- libsocket网络函数库
- 网络函数库
- 网络函数库
- 网络函数库
- 网络函数库
- 网络函数库
- 网络函数库
- Delphi网络函数库
- Python网络函数库
- 一个用于网络的工具函数库
- wininet.dll函数库:检查网络状态
- php 中的网络应用 CURL函数库学习
- socket与网络完全开发函数库
- 函数库
- 函数库
- 函数库
- 函数库
- 函数库
- Configuration类
- Java设计模式:代理模式
- Hibernate常用Annotation标签说明
- 线程同步方法:
- 腾讯在汉投资10亿 建设华中地区最大研发中心
- libsocket网络函数库
- 浅谈HTTP中Get与Post的区别
- Streams捕获进程
- 完全 彻底 删除 百度云管家
- 揭秘:各大视频网站是这样密谋秀场的
- 同步方法
- Java实时获取oracle变更
- E/Zygote(32): setreuid() failed. errno: 2错误
- Hibernate的cascade属性 特别是 cascadeType.all的 作用