当前位置:网站首页>How to play with the reading and writing operations of blocking sockets?
How to play with the reading and writing operations of blocking sockets?
2022-07-01 12:41:00 【Tao song remains the same】
Blocking sockets Read and write operations , I referred to redis Source code , And then I made a change , It's comfortable to use :
/* ----------------- Blocking sockets I/O with timeouts --------------------- */
/* Redis performs most of the I/O in a nonblocking way, with the exception
* of the SYNC command where the slave does it in a blocking way, and
* the MIGRATE command that must be blocking in order to be atomic from the
* point of view of the two instances (one migrating the key and one receiving
* the key). This is why need the following blocking I/O functions.
*
* All the functions take the timeout in milliseconds. */
#define SYNCIO__RESOLUTION 10 /* Resolution in milliseconds */
/* Write the specified payload to 'fd'. If writing the whole payload will be
* done within 'timeout' milliseconds the operation succeeds and 'size' is
* returned. Otherwise the operation fails, -1 is returned, and an unspecified
* partial write could be performed against the file descriptor. */
ssize_t syncWrite(int fd, char *ptr, ssize_t size, long long timeout) {
ssize_t nwritten, ret = size;
long long start = mstime();
long long remaining = timeout;
while(1) {
long long wait = (remaining > SYNCIO__RESOLUTION) ?
remaining : SYNCIO__RESOLUTION;
long long elapsed;
/* Optimistically try to write before checking if the file descriptor
* is actually writable. At worst we get EAGAIN. */
nwritten = write(fd,ptr,size);
if (nwritten == -1) {
if (errno != EAGAIN) return -1;
} else {
ptr += nwritten;
size -= nwritten;
}
if (size == 0) return ret;
/* Wait */
aeWait(fd,AE_WRITABLE,wait);
elapsed = mstime() - start;
if (elapsed >= timeout) {
errno = ETIMEDOUT;
return -1;
}
remaining = timeout - elapsed;
}
}
/* Read the specified amount of bytes from 'fd'. If all the bytes are read
* within 'timeout' milliseconds the operation succeed and 'size' is returned.
* Otherwise the operation fails, -1 is returned, and an unspecified amount of
* data could be read from the file descriptor. */
ssize_t syncRead(int fd, char *ptr, ssize_t size, long long timeout) {
ssize_t nread, totread = 0;
long long start = mstime();
long long remaining = timeout;
if (size == 0) return 0;
while(1) {
long long wait = (remaining > SYNCIO__RESOLUTION) ?
remaining : SYNCIO__RESOLUTION;
long long elapsed;
/* Optimistically try to read before checking if the file descriptor
* is actually readable. At worst we get EAGAIN. */
nread = read(fd,ptr,size);
if (nread == 0) return -1; /* short read. */
if (nread == -1) {
if (errno != EAGAIN) return -1;
} else {
ptr += nread;
size -= nread;
totread += nread;
}
if (size == 0) return totread;
/* Wait */
aeWait(fd,AE_READABLE,wait);
elapsed = mstime() - start;
if (elapsed >= timeout) {
errno = ETIMEDOUT;
return -1;
}
remaining = timeout - elapsed;
}
}
/* Read a line making sure that every char will not require more than 'timeout'
* milliseconds to be read.
*
* On success the number of bytes read is returned, otherwise -1.
* On success the string is always correctly terminated with a 0 byte. */
ssize_t syncReadLine(int fd, char *ptr, ssize_t size, long long timeout) {
ssize_t nread = 0;
size--;
while(size) {
char c;
if (syncRead(fd,&c,1,timeout) == -1) return -1;
if (c == '\n') {
*ptr = '\0';
if (nread && *(ptr-1) == '\r') *(ptr-1) = '\0';
return nread;
} else {
*ptr++ = c;
*ptr = '\0';
nread++;
}
size--;
}
return nread;
}More conventional operation .
边栏推荐
- localtime居然不可重入,踩坑了
- leetcode:329. The longest incremental path in the matrix [DFS + cache + no backtracking + elegance]
- AI matting tool
- MySQL common functions
- 腾讯总考epoll, 很烦
- 数据库之MHA高可用集群部署及故障切换
- JS related interview questions and answers (1)
- Mobile note application
- leetcode:329. 矩阵中的最长递增路径【dfs + cache + 无需回溯 + 优雅】
- R language uses conf of yardstick package_ The mat function calculates the confusion matrix of the multiclass model on each fold of each cross validation (or resampling), and uses the summary to outpu
猜你喜欢

Arm GIC (V) how arm TrustZone supports security interrupt analysis notes.

Chained storage of queues

队列的链式存储

数论基础及其代码实现

Circular linked list--

How to install php7 and perform performance test using yum
![[brain opening] west tide and going to the world series](/img/b2/444af296e170d19629800b3d4c50fa.jpg)
[brain opening] west tide and going to the world series

be based on. NETCORE development blog project starblog - (13) add friendship link function

Sort out relevant contents of ansible

Common chart usage of Bi tools
随机推荐
leetcode:329. 矩阵中的最长递增路径【dfs + cache + 无需回溯 + 优雅】
网络socket的状态要怎么统计?
Tencent security and KPMG released a regulatory technology white paper to analyze the "3+3" hot application scenarios
Queue operation---
Eurake分区理解
哪个券商公司开户佣金低又安全又可靠
晓看天色暮看云,美图欣赏
[datawhale202206] pytorch recommendation system: recall model DSSM & youtubednn
[datawhale202206] pytorch recommendation system: precision model deepfm & DIN
Accept different views with an open mind
买卖其实也有风险
"Analysis of 43 cases of MATLAB neural network": Chapter 40 research on prediction of dynamic neural network time series -- implementation of NARX based on MATLAB
leetcode:226. Flip binary tree [DFS flip]
Application of stack -- bracket matching problem
There are risks in trading
I wish you all a happy reunion
AI matting tool
Chapter 14 signals (IV) - examples of multi process tasks
队列的链式存储
Double linked list related operations