read は考慮必要。
read を while にすると、最後の待ちでブロックしてしまう。
fstatで、ノンブロッキングにすると、最初のreadでデータ受け取れないロジックになる(多分)ので、
実際のデータを見て、Content-lengthをもとに全部データ取得で来たら抜ける
というようにした方がよさそう。バッファも1024固定で取ってるけど、
その場合、malloc, callocで動的に。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#include <stdio.h> #include <stdlib.h> /* exit */ #include <sys/socket.h> /* socket, connect */ #include <netinet/in.h> /* sockaddr_in */ #include <strings.h> /* bzero */ #include <string.h> /* strlen */ #include <netdb.h> /* hostent, gethostbyname */ #define BUFSIZE 1024 #define DESTSERV "dev.furoom.net" #define DESTPORT 80 #define MESSAGE \ "POST /sandbox/socket-http/request.php?g=1 HTTP/1.1\r\n\ Host: dev.furoom.net\r\n\ Authorization: Basic dXNlcjpwYXNzd29yZA==\r\n\ Content-Type: application/x-www-form-urlencoded\r\n\ Content-Length: 7\r\n\ \r\n\ a=1&b=2" int main(int argc, char *argv[]) { struct hostent *hostent; struct sockaddr_in server; char buf[BUFSIZE]; int fd; int len; int ret = 1; /* failure */ /* initial */ bzero(&server, sizeof(server)); bzero(&buf, sizeof(buf)); /* lookup ip */ hostent = gethostbyname(DESTSERV); if (hostent == NULL) { herror(DESTSERV); return ret; } /* create socket */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); return ret; } /* connect */ server.sin_family = AF_INET; bcopy(hostent->h_addr, &server.sin_addr, hostent->h_length); server.sin_port = htons(DESTPORT); if (connect(fd, (struct sockaddr *)&server, sizeof(server)) == -1) { perror("connect"); goto close_exit; } /* request */ if (write(fd, MESSAGE, strlen(MESSAGE)) < 0) { perror("write"); goto close_exit; } /* response */ if (read(fd, buf, sizeof(buf)) < 0) { perror("read"); goto close_exit; } printf("%s\n", buf); ret = 0; /* success */ close_exit: close(fd); return ret; } |