当前位置:网站首页>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 .
边栏推荐
- 【历史上的今天】7 月 1 日:分时系统之父诞生;支付宝推出条码支付;世界上第一支电视广告
- [20211129] configuration du serveur distant du carnet de notes jupyter
- Three stages of aho
- Powerful, easy-to-use, professional editor / notebook software suitable for programmers / software developers, comprehensive evaluation and comprehensive recommendation
- codeforces -- 4B. Before an Exam
- Compile and debug net6 source code
- MySQL的零拷贝技术
- What are the PHP FPM configuration parameters
- Circular linked list--
- 使用nvm管理nodejs(把高版本降级为低版本)
猜你喜欢
Double linked list related operations
使用nvm管理nodejs(把高版本降级为低版本)
Ikvm of toolbox Net project new progress
晓看天色暮看云,美图欣赏
Arm GIC (V) how arm TrustZone supports security interrupt analysis notes.
基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能
第十四章 信号(四)- 多进程任务示例
Share several tools for designing exquisite circuit diagrams
[datawhale202206] pytorch recommendation system: recall model DSSM & youtubednn
Logstash error: cannot reload pipeline, because the existing pipeline is not reloadable
随机推荐
Operations related to sequence table
Switch basic experiment
ASTM D 3801固体塑料垂直燃烧试验
腾讯安全联合毕马威发布监管科技白皮书,解析“3+3”热点应用场景
运行Powershell脚本提示“因为在此系统上禁止运行脚本”解决办法
System test UI test summary and questions (interview)
Common chart usage of Bi tools
腾讯总考epoll, 很烦
Blocking sockets的读写操作该怎么玩?
Nc100 converts strings to integers (ATOI)
Chapter 14 signals (IV) - examples of multi process tasks
AI matting tool
leetcode:226. Flip binary tree [DFS flip]
ASTM D 3801 vertical burning test of solid plastics
Using burpsuite to capture app packages
GID: open vision proposes a comprehensive detection model knowledge distillation | CVPR 2021
CPI tutorial - asynchronous interface creation and use
Arm GIC (V) how arm TrustZone supports security interrupt analysis notes.
【脑洞大开】《西潮》及《走向世界丛书》
2022-06-28-06-29