之前写C代码的时候,头文件都是复制粘贴过来的,时间久了,发现想自己手写代码的时候都不知道要包含哪些头文件了,所以稍微整理下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int main(void)
{
    // uint8_t[4] 数组转成单个 10 进制数值
    uint8_t uint8_t_array[]={0x00,0x00,0x08,0xcc};
    
    uint32_t decimal = 0;
    
    decimal = (uint8_t_array[0]<<24)|(uint8_t_array[1]<<16)|(uint8_t_array[2]<<8)|(uint8_t_array[3]);
    
    printf("%d",decimal);
    
    printf("\n\n");
    
    // 将单个 10 进制数值转成 uint8_t[4] 数组
    unsigned char hexBuffer[4]={0};
    int i;
    
    memcpy((char*)hexBuffer,(char*)&decimal,sizeof(int));
    
    for(i=3;i>=0;i--)
        printf("%02X ",hexBuffer[i]);
    
    
    printf("\n\n");
    
    return 0;    
}

本程序的作用,创建两个线程,线程A创建Unix套接字客户端,与Unix套接字服务端通信,收发数据,线程B创建websocket服务端,与浏览器通信,收发数据。

本程序的作用是,创建两个线程,线程A负责产生数据并存入数据库,线程B创建一个Unix套接字服务端并监听。

在之前的文章中,实现了一个从客户端发送字符串数据到服务器的Socket程序。但是在实际应用中,往往需要通过Socket传输其他复杂一点的数据,例如struct结构或者uint8_t数组等等。

在很多语言中都有sleep(),delay()等这样的函数,让程序能延迟或等待一段时间再执行。JavaScriptsetTimeout()方法来实现设定一段时间后执行某个任务

服务端(Linux版)

#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX 80
#define PORT 2087
#define SA struct sockaddr

// Function designed for chat between client and server.
void func(int sockfd)
{
    char buff[MAX];
    for(;;)
    {
        bzero(buff, sizeof(buff));
        recv(sockfd, buff, sizeof(buff), 0);
        if ((strncmp(buff, "exit", 4)) == 0) {
            printf("Client Exit...\n");
            break;
        }        
        printf("From Client : %s", buff);
        send(sockfd, buff, sizeof(buff), 0);
    }
}

static void sig_handler(int sig){
    
    int retval;
    
    if ( sig == SIGCHLD ){ 
        // 等待子程序的結束狀態
        wait(&retval);
        
        printf("CATCH SIGNAL PID=%d\n",getpid());
    }
}
  
// Driver function
int main(void)
{
    int sockfd, connfd;
    struct sockaddr_in servaddr, cli;
    socklen_t len;
    pid_t pid;
  
    // socket create and verification
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        printf("socket creation failed...\n");
        exit(0);
    }
    else
        printf("Socket successfully created..\n");
    
    bzero(&servaddr, sizeof(servaddr));
  
    // assign IP, PORT
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT);
    
    int reuse = 1;
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int)) == -1)
        printf("Can't set the reuse option on the socket");
  
    // Binding newly created socket to given IP and verification
    if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) {
        printf("socket bind failed...\n");
        exit(0);
    }
    else
        printf("Socket successfully binded..\n");
  
    // Now server is ready to listen and verification
    if ((listen(sockfd, 5)) != 0) {
        printf("Listen failed...\n");
        exit(0);
    }
    else
        printf("Server listening..\n");
        
  
    while(1)
    {
        // Accept the data packet from client and verification
        len = sizeof(cli);        
        connfd = accept(sockfd, (SA*)&cli, &len);
        if (connfd < 0) {
            printf("server acccept failed...\n");
            exit(0);
        }
        else
            printf("server acccept the client...\n");
        
        // 呼叫 signal 來接收 SIGCHLD 信號
        signal(SIGCHLD,sig_handler);
        
        pid = fork();
        
        if(pid < 0)
            printf("ERROR on fork");
        
        if(pid == 0)
        {
            close(sockfd);
            
            // Function for chatting between client and server
            func(connfd);
            close(connfd);
            exit(0);            
        }
        else
        {
            close(connfd);
        }
            
    }    
  
    // After chatting close the socket
    close(sockfd);
    
    return 0;
}

网络中的进程如何通信

在计算机中,本地进程通信(IPC)有很多种方法,可以总结为4类:

静态库

简单来说静态库(static library)就是将一些函数和变量打包,可以直接在其他地方调用。与之对应的还有动态库(dynamic library)。两者相比:

电力系统中常见的设备分为调度端(控制站、主站、客户机) , 服务端(被控站、子站,典型设备包含TTU、RTU等),两者之间通过104规约来进行数据通信与传输。其传输层实际上使用的是TCP协议进行数据的传输。固定端口号为2404。《电力系统104规约帧报文解析》