坚持 成长 每日一篇
readLine读取一行数据
返回-1表示读取失败,注意返回的数据是带\n。
ssize_t readLine(int fildes, void *buf, size_t nbyte)
{
int offset = 0;
ssize_t ret = -1;
while ((nbyte-offset) > 0)
{
ret = read(fildes, buf + offset, 1);
if (ret == 1)
{
offset++;
char ch = *((char *)(buf + offset - 1));
if (ch == '\n')
{
return offset;
}
}
else if (ret == 0)
{
return offset;
}
else
{
return -1;
}
}
return offset;
}
readN读取固定字节
读取固定字节,都到结尾返回已读子节数,-1表示读取失败
ssize_t readN(int fildes, void *buf, size_t nbyte)
{
int offset = 0;
ssize_t ret = -1;
while ((nbyte-offset) > 0)
{
ret = read(fildes, buf + offset, nbyte-offset);
if (ret > 0)
{
offset += ret;
}
else if (ret == 0)
{
return offset;
}
else
{
return -1;
}
}
return offset;
}
openSocket根据iP地址和端口号连接套接字
成功返回连接成功后的套接字,失败返回-1。
int openSocket(const char *ip, uint16_t port)
{
int socketfd = -1;
ssize_t ret = -1;
struct sockaddr_in serverAddr;
serverAddr.sin_family = PF_INET;
serverAddr.sin_port = htons(port) ;
inet_pton(PF_INET, ip, &(serverAddr.sin_addr.s_addr));
socketfd = socket(PF_INET, SOCK_STREAM, 0);
if (socketfd < 0)
{
perror("socket err");
return -1;
}
printf("socketfd = %d\n", socketfd);
ret = connect(socketfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (ret < 0)
{
perror("connect err");
close(socketfd);
return -1;
}
return socketfd;
}
openListenSocket以本地地址起监听套接字
成功返回监听的套接字,失败返回-1;
int openListenSocket(uint16_t port)
{
int listenSocketfd = -1;
ssize_t ret = -1;
struct sockaddr_in serverAddr;
serverAddr.sin_family = PF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = INADDR_ANY;
listenSocketfd = socket(PF_INET, SOCK_STREAM, 0);
if (listenSocketfd < 0)
{
perror("socket err");
return -1;
}
ret = bind(listenSocketfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (ret < 0)
{
perror("bind err");
close(listenSocketfd);
return -1;
}
ret = listen(listenSocketfd, 5);
if (ret < 0)
{
perror("listen err");
close(listenSocketfd);
return -1;
}
return listenSocketfd;
}
readN_timeout读取字节超时
参数sec表示超过多少时间就认为读取超时,该函数一般适用于网络请求
ssize_t readN_timeout(int fildes, void *buf, size_t nbyte, long sec)
{
fd_set readFdSet;
int offset = 0;
ssize_t ret = -1;
struct timeval timeout;
time_t time1 = time(NULL);
time_t time2 = time1;
time_t sumTime = 0;
while ((nbyte-offset) > 0)
{
FD_ZERO(&readFdSet);
FD_SET(fildes, &readFdSet);
if (sec - sumTime <= 0)
{
break;
}
timeout.tv_sec = sec - sumTime;
timeout.tv_usec = 0;
//计算等待可读数据,select的返回值1表示有数据可读
time1 = time(NULL);
ret = select(fildes+1, &readFdSet, NULL, NULL, &timeout);
time2 = time(NULL);
sumTime += (time2 - time1);
if (ret == 1)
{
ret = read(fildes, buf + offset, nbyte-offset);
if (ret > 0)
{
offset += ret;
}
else if (ret == 0)
{
break;
}
else
{
return -1;
}
}
else
{
return -1;
}
}
return offset;
}
writeN_timeout写入字节超时
同上
ssize_t writeN_timeout(int fildes, const void *buf, size_t nbyte, long sec)
{
fd_set writeFdSet;
int offset = 0;
ssize_t ret = -1;
struct timeval timeout;
time_t time1 = time(NULL);
time_t time2 = time1;
time_t sumTime = 0;
while ((nbyte-offset) > 0)
{
FD_ZERO(&writeFdSet);
FD_SET(fildes, &writeFdSet);
if (sec - sumTime <= 0)
{
break;
}
timeout.tv_sec = sec - sumTime;
timeout.tv_usec = 0;
time1 = time(NULL);
ret = select(fildes+1, NULL, &writeFdSet, NULL, &timeout);
time2 = time(NULL);
sumTime += (time2 - time1);
if (ret == 1)
{
ret = write(fildes, buf + offset, nbyte - offset);
if (ret < 0)
{
return -1;
}
offset += ret;
}
else
{
return -1;
}
}
return offset;
}
contentsWithPath查看目下的文件夹返回OC数组
/*OC的NSFileManager下有一个面向对象的方法-(NSArray *)contentsOfDirectoryAtPath:error:相同的功能
*封装一个oc语法的获取目录下子目录
*path为文件夹路径时候返回数组,否则返回nil。出错返回数组为nil 输出error 否则error为空
*目录下没有可见文件返回数组包含0个对象
*/
NSArray* contentsWithPath(NSString *path,NSError **error)
{
DIR *dp;
struct dirent *dirp;
const char *c_path = [path cStringUsingEncoding:NSUTF8StringEncoding];
if ((dp = opendir(c_path)) == NULL) {
if (error == nil) {
return nil;
}
*error = [[NSError alloc] initWithDomain:@"can open Dir" code:505 userInfo:nil];
return nil;
}
NSMutableArray *array = [[NSMutableArray alloc] init];
while ((dirp = readdir(dp)) != NULL) {
//printf("文件名:%s 类型:%d\n",dirp->d_name,dirp->d_type); 类型为4:文件夹 8:普通文件
NSString *fileName = [NSString stringWithUTF8String:dirp->d_name];
//去除隐藏的文件,Mac下以.开头命名的文件会变成隐藏文件
if ([fileName hasPrefix:@"."]) {
}else
{
[array addObject:fileName];
}
}
return array;
}