本帖最后由 jf_93040878 于 2020-10-20 13:12 编辑
收到imx6ull有段时间了,之前按照repo方式下载同步代码一直失败,昨天翻到哔哩哔哩上的视频,原来“fatal: No names found, cannot describe anything.”可以忽略不管的,那么为何我忽略不管下载的东西不完整了。于是看完视频后再次下载,灵异现象就这样出现了,此次下载的数据是完整的,Linux内核也有了,可以前只有build开头的一个文件夹。
本想在这板子上来驱动的步骤,想想还是socket吧。显示tcp的c/s模式,再之后的udp模式。两者结合,就可以出现上电后,自动获取底层装置的ip地址了,这在上位机上自动出现已有装置很方便的说。
先瞅瞅c/s模式下的运行结果吧,程序比较简单,仅作演示而已。
从上图可以看到,client程序发送的消息server已经收到并显示,若做出其他响应也是可以的。这边的处理比较简单。
下面就来看看server的源码吧。
/* server.c */
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #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 ========rn",
- __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 ...rn");
- close(cfd);
- break;
- }
- else
- {
- printf("server recv: %srn", buf);
- send(cfd, buf, recvlen, 0);
- }
- }
- close(cfd);
- close(lfd);
- return 0;
- }
复制代码
流程大概调用的接口如下:socket、bind、listen、accept。
看完了server的流程,下面来看看client的吧。client对应的源码client.c如下:
- /* client.c */
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #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_namern");
- 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: %srn", buf);
- }
- close(lfd);
- return 0;
- }
复制代码
流程大概调用的接口如下:socket、bind、connect,相较于server简单点,少了listen的过程。
虽然C/S模式下的流程简单,最后还是整理一个简单的过程图吧,毕竟是使用思维导图软件做的,仅供示意而已。
ok,本次的分享就到此结束,下次再准备一下。
|