OSDN Git Service

addid library source 20140221
[zither/ds-zither.git] / libms / socket_readas.c
1 // socket_readas.c
2 // masashi shimakura 20140223
3
4 #include<stdio.h>
5 #include<fcntl.h>
6 #include <errno.h>
7 #include <unistd.h>
8 #include <string.h>
9
10 #include "libms.h"
11
12 // #define SOCKET_READBUG
13
14 int socket_readas(int sk, char * readdata, int max, int interval, int mode){
15 int ret, stat;
16 char cha[64];
17
18 struct timeval tv;
19 int retval;
20 fd_set rfds;
21
22 tv.tv_sec = interval;
23 tv.tv_usec = 0;
24
25
26 memset(cha, 0x00, 64);
27
28 ret = 0;
29 stat = 0;
30
31 while(1){
32    FD_ZERO(&rfds);
33    FD_SET(sk, &rfds);
34
35    retval = select(sk + 1, &rfds, NULL, NULL, &tv);
36
37    if(retval < 0){
38       #ifdef SOCKET_READBUG
39       printf("SOCKET: socket_read(2): NG select <%d> ERRNO: %d %s\n",
40         retval, errno, strerror(errno));
41       #endif
42       ret = -1;
43       break;
44       }
45    if(retval == 0){
46       #ifdef SOCKET_READBUG
47       printf("SOCKET: socket_read(3): NG select. time out break <%d> ERRNO: %d %s\n",
48         retval, errno, strerror(errno));
49       #endif
50       ret = -1;
51       break;
52       }
53    if(retval >= 1){
54
55       stat = read(sk, cha, 32);
56
57       #ifdef SOCKET_READBUG
58       printf("stat = %d string = %s front_char = %02x %02x %02x %02x\n", stat, cha, cha[0], cha[1], cha[2], cha[3]);
59       printf("rear_char = %02x %02x %02x\n",cha[stat -2], cha[stat -1], cha[stat]);
60       #endif
61
62       if(stat < 0){
63          #ifdef SOCKET_READBUG
64          printf("BREAK stat==0\n");
65          #endif
66          break;
67          }
68
69       if(stat == 0 && cha[0] == 0x00 && cha[1] == 0x00){
70          #ifdef SOCKET_READBUG
71          printf("BREAK stat==0 cha0=00 cha1=00\n");
72          #endif
73          break;
74          }
75
76       if(stat == 1 && cha[0] == 0x0a && cha[1] == 0x00){
77          #ifdef SOCKET_READBUG
78          printf("BREAK stat==1 cha0=0a cha1=00\n");
79          #endif
80          break;
81          }
82
83       if(stat >= 2){
84          if(mode == 1){
85             if(cha[stat - 1] == 0x0a){
86                #ifdef SOCKET_READBUG
87                printf("BREAK stat>1 0d [mode 1]\n");
88                #endif
89                strncat(readdata, cha, stat);
90                memset(cha, 0x00, 33);
91                ret = ret + stat;
92                break;
93                }
94             }
95          if(cha[stat - 2] == 0x0d && cha[stat - 1] == 0x0a){
96             #ifdef SOCKET_READBUG
97             printf("BREAK stat>1 0d 0a\n");
98             #endif
99             strncat(readdata, cha, stat);
100             memset(cha, 0x00, 33);
101             ret = ret + stat;
102             break;
103             }
104          else{
105             strncat(readdata, cha, stat);
106             memset(cha, 0x00, 33);
107             ret = ret + stat;
108             if(ret > max - 32){
109                #ifdef SOCKET_READBUG
110                fprintf("socket_reada(): read size err.\n");
111                #endif
112                break;
113                }
114             }
115
116          }
117       }
118    } // while()
119
120 return(ret);
121 }
122
123
124