zjhsucceed_329 发表于 2014-3-29 00:20:30

基于事件驱动模型的Linux网络编程库

本帖最后由 zjhsucceed_329 于 2014-3-29 00:21 编辑

自己写的网络函数库,使用非常方便。
当有数据可读时,系统就会调用用户注册的函数。
当有新的客户连接时,系统就会调用用户注册的函数。
源码下载地址:
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                 0

bool QUIT = false;
void handle(int sig)
{
        if (sig == SIGINT)
                QUIT = true;
}

// 有数据可读,将调用此函数
static void readCallback(Socket *sp)
{
        int n;
        char buf = {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));
       
}
#endif

int main(int argc, char **argv)
{
       
        signal(SIGINT, handle);
       
        // 初始化libsocket
        libSocketInit();
       
// UDP Test
#if TEST == UDP_TEST
       
        printf("UDP Test\n");

        if (argc != 3)
        {
                fprintf(stderr, "Usage:%s ip port\n", argv);
                return -1;
        }
       
        // 创建数据报套接字
        Socket *sp = createSocket(SOCK_DGRAM, SOCKET_BROADCAST, readCallback);
        if (sp == NULL)
                return -1;
       
        // 指定要发送的目标地址
        if (connectSocket(sp, argv, atoi(argv)) < 0)
                return -1;
       
        // 绑定本地端口
        listenSocket(sp, PORT);
       
        printf("listen on %d\n", PORT);
               
#elif TEST == TCP_C_TEST
// TCP Client Test
        int n, fd;
        char buf = {0};
       
        printf("Tcp Client Test\n");
       
        if (argc != 3)
        {
                fprintf(stderr, "Usage:%s ip port\n", argv);
                return -1;
        }
       
        // 创建流式套接字
        Socket *sp = createSocket(SOCK_STREAM, 0, readCallback);
        if (sp == NULL)
                return -1;
       
        // 连接指定的服务器
        if (connectSocket(sp, argv, atoi(argv)) < 0)
                return -1;

#elif TEST == TCP_S_TEST
// TCP Server Test
       
        printf("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);
#endif

        while (!QUIT)
                sleep(1);
               
        sleep(1);

        // 释放libsocket资源
        libSocketDeinit();
        printf("quit\n");
        return 0;
}


13714765431 发表于 2014-7-7 08:51:00

如何使用啊,请指点,谢谢,我的邮箱:13714765431@qq.com

zjhsucceed_329 发表于 2014-7-7 11:15:31

自己看测试代码
页: [1]
查看完整版本: 基于事件驱动模型的Linux网络编程库