天嵌 ARM开发社区

 找回密码
 注册
查看: 4715|回复: 2

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

[复制链接]
zjhsucceed_329 发表于 2014-3-29 00:20:30 | 显示全部楼层 |阅读模式
本帖最后由 zjhsucceed_329 于 2014-3-29 00:21 编辑

自己写的网络函数库,使用非常方便。
当有数据可读时,系统就会调用用户注册的函数。
当有新的客户连接时,系统就会调用用户注册的函数。
源码下载地址:
https://sourceforge.net/projects/libsocketc/

测试代码
  1. #include "libsocket.h"
  2. #include <signal.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <stdbool.h>

  8. #define PORT 8888

  9. #define UDP_TEST           0
  10. #define TCP_C_TEST         1
  11. #define TCP_S_TEST         2

  12. // 修改下面的数字,选择你要测试的项目。修改后,重新执行make,即可运行test
  13. #define TEST                 0

  14. bool QUIT = false;
  15. void handle(int sig)
  16. {
  17.         if (sig == SIGINT)
  18.                 QUIT = true;
  19. }

  20. // 有数据可读,将调用此函数
  21. static void readCallback(Socket *sp)
  22. {
  23.         int n;
  24.         char buf[1024] = {0};
  25.         n = readSocket(sp, buf, 1000);
  26.        
  27.         if (n == 0)
  28.         {
  29.                 printf("The peer had shutdown\n");
  30.                 return;
  31.         }
  32.        
  33.         printf("------------------------------\n");
  34.         if (TEST == UDP_TEST)
  35.         {
  36.                 printf("read from %s:%d\n", inet_ntoa(sp->pAddr.sin_addr), ntohs(sp->pAddr.sin_port));
  37.                 writeSocket(sp, buf, strlen(buf) + 1, W_PEER);        // 向对端地址发送数据(用于UDP)
  38.                 //writeSocket(sp, buf, strlen(buf) + 1, W_DST);        // 向指定的目标地址发送数据(用于UDP)
  39.         }
  40.         else if (TEST == TCP_C_TEST)
  41.         {
  42.                 printf("read from %s:%d\n", inet_ntoa(sp->dAddr.sin_addr), ntohs(sp->dAddr.sin_port));
  43.                 writeSocket(sp, buf, strlen(buf) + 1, 0);
  44.         }
  45.         else if (TEST == TCP_S_TEST)
  46.         {
  47.                 printf("read from %s:%d\n", inet_ntoa(sp->pAddr.sin_addr), ntohs(sp->pAddr.sin_port));
  48.                 writeSocket(sp, buf, strlen(buf) + 1, 0);
  49.         }
  50.         printf("%s\n", buf);
  51. }

  52. #if TEST == TCP_S_TEST
  53. // 当有新的客户连接时,将调用此函数
  54. static void callbackAccept(Socket *sp)
  55. {
  56.         Socket *sp_c = acceptSocket(sp, readCallback);
  57.         printf("New connection:%s:%d\n", inet_ntoa(sp_c->pAddr.sin_addr), ntohs(sp_c->pAddr.sin_port));
  58.        
  59. }
  60. #endif

  61. int main(int argc, char **argv)
  62. {
  63.        
  64.         signal(SIGINT, handle);
  65.        
  66.         // 初始化libsocket
  67.         libSocketInit();
  68.        
  69. // UDP Test
  70. #if TEST == UDP_TEST
  71.        
  72.         printf("UDP Test\n");

  73.         if (argc != 3)
  74.         {
  75.                 fprintf(stderr, "Usage:%s ip port\n", argv[0]);
  76.                 return -1;
  77.         }
  78.        
  79.         // 创建数据报套接字
  80.         Socket *sp = createSocket(SOCK_DGRAM, SOCKET_BROADCAST, readCallback);
  81.         if (sp == NULL)
  82.                 return -1;
  83.        
  84.         // 指定要发送的目标地址
  85.         if (connectSocket(sp, argv[1], atoi(argv[2])) < 0)
  86.                 return -1;
  87.        
  88.         // 绑定本地端口
  89.         listenSocket(sp, PORT);
  90.        
  91.         printf("listen on %d\n", PORT);
  92.                
  93. #elif TEST == TCP_C_TEST
  94. // TCP Client Test
  95.         int n, fd;
  96.         char buf[1024] = {0};
  97.        
  98.         printf("Tcp Client Test\n");
  99.        
  100.         if (argc != 3)
  101.         {
  102.                 fprintf(stderr, "Usage:%s ip port\n", argv[0]);
  103.                 return -1;
  104.         }
  105.        
  106.         // 创建流式套接字
  107.         Socket *sp = createSocket(SOCK_STREAM, 0, readCallback);
  108.         if (sp == NULL)
  109.                 return -1;
  110.        
  111.         // 连接指定的服务器
  112.         if (connectSocket(sp, argv[1], atoi(argv[2])) < 0)
  113.                 return -1;

  114. #elif TEST == TCP_S_TEST
  115. // TCP Server Test
  116.        
  117.         printf("Tcp Server Test\n");
  118.         // 创建流式套接字
  119.         Socket *sp = createSocket(SOCK_STREAM, 0, callbackAccept);
  120.         if (sp == NULL)
  121.                 return -1;
  122.        
  123.         // 绑定本地端口,并监听
  124.         listenSocket(sp, 8888);
  125.         printf("listen on %d\n", PORT);
  126. #endif

  127.         while (!QUIT)
  128.                 sleep(1);
  129.                
  130.         sleep(1);

  131.         // 释放libsocket资源
  132.         libSocketDeinit();
  133.         printf("quit\n");
  134.         return 0;
  135. }
复制代码



13714765431 发表于 2014-7-7 08:51:00 | 显示全部楼层
如何使用啊,请指点,谢谢,我的邮箱:13714765431@qq.com
 楼主| zjhsucceed_329 发表于 2014-7-7 11:15:31 | 显示全部楼层
自己看测试代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-26 07:15 , Processed in 1.062500 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表