打印
[应用相关]

【100ASK_IMX6ULL(带屏) 开发板试用体验】2,c/s模式下的socket...

[复制链接]
606|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
收到imx6ull有段时间了,之前按照repo方式下载同步代码一直失败,昨天翻到哔哩哔哩上的视频,原来“fatal: No names found, cannot describe anything.”可以忽略不管的,那么为何我忽略不管下载的东西不完整了。于是看完视频后再次下载,灵异现象就这样出现了,此次下载的数据是完整的,Linux内核也有了,可以前只有build开头的一个文件夹。

本想在这板子上来驱动的步骤,想想还是socket吧。显示tcp的c/s模式,再之后的udp模式。两者结合,就可以出现上电后,自动获取底层装置的ip地址了,这在上位机上自动出现已有装置很方便的说。

先瞅瞅c/s模式下的运行结果吧,程序比较简单,仅作演示而已。



从上图可以看到,client程序发送的消息server已经收到并显示,若做出其他响应也是可以的。这边的处理比较简单。

下面就来看看server的源码吧。





  • <div class="blockcode"><blockquote>/* server.c */
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <unistd.h>
  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <string.h>
  • #include <arpa/inet.h>
  • #include <sys/un.h>
  • #include <pthread.h>
  • #define LISTEN_NUM  36
  • static char* file_server_socket = "server.socket";
  • int main(int argc, char* argv[])
  • {
  •     int lfd, cfd;
  •     int ret;
  •     struct sockaddr_un server, client;
  •     socklen_t len = sizeof(client);
  •     int recvlen;
  •     // create socket
  •     lfd = socket(AF_LOCAL, SOCK_STREAM, 0);
  •     if(lfd < 0)
  •     {
  •         perror("create socket");
  •         return -1;
  •     }
  •     //delete sock file
  •     remove(file_server_socket);
  •     //init socket
  •     server.sun_family = AF_LOCAL;
  •     strcpy(server.sun_path, file_server_socket);
  •     //bind
  •     ret = bind(lfd, (struct sockaddr*)&server, sizeof(server));
  •     if(ret < 0)
  •     {
  •         perror("bind socket");
  •         return -1;
  •     }
  •     //listen
  •     ret = listen(lfd, LISTEN_NUM);
  •     if(ret < 0)
  •     {
  •         perror("listen socket");
  •         return -1;
  •     }
  •     char buf[1024] = {0};
  •     cfd = accept(lfd, (struct sockaddr*)&client, &len);
  •     if(cfd < 0)
  •     {
  •         perror("accept client");
  •         return -1;
  •     }
  •     printf("%s, %d, client bind file: %s ========\r\n",
  •             __FUNCTION__, __LINE__, client.sun_path);
  •     while(1)
  •     {
  •         recvlen = recv(cfd, buf, sizeof(buf), 0);
  •         if(recvlen < 0)
  •         {
  •             perror("recv client msg");
  •             break;
  •         }
  •         else if(recvlen == 0)
  •         {
  •             printf("client disconnect ...\r\n");
  •             close(cfd);
  •             break;
  •         }
  •         else
  •         {
  •             printf("server recv: %s\r\n", buf);
  •             send(cfd, buf, recvlen, 0);
  •         }
  •     }
  •     close(cfd);
  •     close(lfd);
  •     return 0;
  • }


[color=rgb(51, 102, 153) !important]复制代码




流程大概调用的接口如下:socket、bind、listen、accept。

看完了server的流程,下面来看看client的吧。client对应的源码client.c如下:



  • /* client.c */
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <unistd.h>
  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <string.h>
  • #include <arpa/inet.h>
  • #include <sys/un.h>
  • #include <pthread.h>
  • #define LISTEN_NUM  36
  • static char* file_client_socket = NULL;//"client.socket";
  • static char* file_server_socket = "server.socket";
  • int main(int argc, char* argv[])
  • {
  •     int lfd;
  •     int ret;
  •     struct sockaddr_un server, client;
  •     socklen_t len = sizeof(client);
  •     char buf[1024] = {0};
  •     int recvlen;
  •     if(argc < 2)
  •     {
  •         printf("./client client_sock_name\r\n");
  •         return -1;
  •     }
  •     file_client_socket = argv[1];
  •     // create socket
  •     lfd = socket(AF_LOCAL, SOCK_STREAM, 0);
  •     if(lfd < 0)
  •     {
  •         perror("create socket");
  •         return -1;
  •     }
  •     //delete sock file
  •     remove(file_client_socket);
  •     //init client socket
  •     client.sun_family = AF_LOCAL;
  •     strcpy(client.sun_path, file_client_socket);
  •     //bind
  •     ret = bind(lfd, (struct sockaddr*)&client, sizeof(client));
  •     if(ret < 0)
  •     {
  •         perror("bind socket");
  •         return -1;
  •     }
  •     //init server socket
  •     server.sun_family = AF_LOCAL;
  •     strcpy(server.sun_path, file_server_socket);
  •     //connect server
  •     ret = connect(lfd, (struct sockaddr*)&server, sizeof(server));
  •     if(ret < 0)
  •     {
  •         perror("connect server");
  •         //return -1;
  •     }
  •     while(1)
  •     {
  •         //memset(buf, 0, sizeof(buf));
  •         fgets(buf, sizeof(buf), stdin);
  •         send(lfd, buf, strlen(buf)+1, 0);
  •         memset(buf, 0, sizeof(buf));
  •         recv(lfd, buf, sizeof(buf), 0);
  •         printf("client recv: %s\r\n", buf);
  •     }
  •     close(lfd);
  •     return 0;
  • }


[color=rgb(51, 102, 153) !important]复制代码




流程大概调用的接口如下:socket、bind、connect,相较于server简单点,少了listen的过程。
虽然C/S模式下的流程简单,最后还是整理一个简单的过程图吧,毕竟是使用思维导图软件做的,仅供示意而已。



ok,本次的分享就到此结束,下次再准备一下。






使用特权

评论回复
沙发
dspmana| | 2021-3-4 23:40 | 只看该作者
100ASK_IMX6ULL申请的吗  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

689

主题

3274

帖子

0

粉丝