admin 发布的文章

在之前的文章中,实现了一个从客户端发送字符串数据到服务器的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规约帧报文解析》

#include <stdio.h>

int main(void)
{
    char s[] = "How big is it?";
    char* t = s;
    printf("数组有多大:%lld\n", sizeof(s));
    printf("指针有多大:%lld\n", sizeof(t));
    return 0;
}

整体管理

项目章程内容
1)概括性的项目描述和项目产品描述。
2)项目目的或批准项目的理由,即为什么要做这个项目。
3)项目的总体要求,包括项目的总体范围和总体质量要求。
4)可测量的项目目标和相关的成功标准。
5)项目的主要风险,如项目的主要风险类别。
6)总体里程碑进度计划。
7)总体预算。
8)项目的审批要求,即在项目的规划、执行、监控和收尾过程中,应该由谁来做出哪种批准。
9)委派的项目经理及其职责和职权。
10)发起人或其他批准项目章程的人员的姓名和职权。

合同类型的选择

  • 假如工作中范畴很确立,且项目的设计方案已具有详尽的关键点,则应用总价合同。
  • 假如工作内容清晰,但范畴并不是很清晰,并且工作中不繁杂,又必须迅速签合同,则应用工料合同书。
  • 假如工作中范畴尚不清楚,则应用成本费赔偿合同书。
  • 假如彼此分摊风险性,则应用工料合同书;假如买家担负成本费风险性,则应用成本费赔偿合同书;假如卖方担负成本费风险性,则应用总价合同。
  • 如果是选购规范商品,且总数并不大,则应用单侧合同书。

参考来源:
https://www.1dq.com/news/137942722454622208.html