(转载自知乎)25 岁庸庸碌碌的我,人生的方向在哪?
问:
问:
一般场景下nginx,php,mysql都是装在一台机器上的,那么没必要使用TCP模式来连接彼此,而是使用unix socket方式。
之前写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;
} MySQL5.1及之后就支持了事件。
fastcgi在nginx转发时选择:同台机器选择sock文件,速度快,但不能跨机器,TCP则可以跨机器。
本程序的作用,创建两个线程,线程A创建Unix套接字客户端,与Unix套接字服务端通信,收发数据,线程B创建websocket服务端,与浏览器通信,收发数据。
本程序的作用是,创建两个线程,线程A负责产生数据并存入数据库,线程B创建一个Unix套接字服务端并监听。
本文转载自知乎,原文链接:https://www.zhihu.com/question/54557903
在之前的文章:使用Socket发送非字符串数据中实现了socket发送非字符串数据的功能,我本以为是个完美的方案。但是在使用valgrind调试的时候发现了内存越界的问题。由于我是初学C,面对这个问题显得有些手足无措。还好经过了半天的试错,终于解决了。
关于MySQL C API参考的是这个教程MySQL C API programming,按照上述教程新建一个文件check_mysql.c
在之前的文章中,实现了一个从客户端发送字符串数据到服务器的Socket程序。但是在实际应用中,往往需要通过Socket传输其他复杂一点的数据,例如struct结构或者uint8_t数组等等。
在很多语言中都有sleep(),delay()等这样的函数,让程序能延迟或等待一段时间再执行。JavaScript有setTimeout()方法来实现设定一段时间后执行某个任务
#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类:
总体步骤和创建静态库没有什么区别,需要注意的是创建动态库时,需要在库的任意一个头文件xx.h中添加__declspec(dllexport),具体请查看dllexport、dllimport
简单来说静态库(static library)就是将一些函数和变量打包,可以直接在其他地方调用。与之对应的还有动态库(dynamic library)。两者相比:
在之前的文章使用 libserialport 来实现串口通信中有一段来自 stackoverflow 的unsigned long to string函数代码,这是一个将ul类型的数字转成string的代码,原理是计算每个数字对应的字母,然后在一段连续的内存地址上从尾至前排列。也就是下面这段代码的含义
datatype *var_name; 电力系统中常见的设备分为调度端(控制站、主站、客户机) , 服务端(被控站、子站,典型设备包含TTU、RTU等),两者之间通过104规约来进行数据通信与传输。其传输层实际上使用的是TCP协议进行数据的传输。固定端口号为2404。《电力系统104规约帧报文解析》