困っていること
C言語でのサーバーの起動で、
Permission denied
と出てしまい、正常に動作しません。
該当のソースコード
C
1 2#include <sys/fcntl.h> 3#include <strings.h> 4#include <string.h> 5#include <sys/socket.h> 6#include <unistd.h> 7#include <sys/types.h> 8#include <errno.h> 9#include <netinet/in.h> 10#include <netdb.h> 11#include <stdlib.h> 12#include <stdio.h> 13#include <stdbool.h> 14 15 16#define HTTP_TCP_PORT 80 17 18#define CR 13 19 20#define LF 10 21 22int send_msg(int fd, char *msg) { 23 24 int len; 25 26 len = strlen(msg); 27 28 if ( write(fd, msg, len) != len ){ 29 30 fprintf(stderr, "error: writing."); 31 32 } 33 34 return len; 35 36} 37 38void http(int sockfd) { 39 int len; 40 int read_fd; 41 char buf[1024]; 42 char meth_name[16]; 43 char uri_addr[256]; 44 char http_ver[64]; 45 char *uri_file; 46 if (read(sockfd, buf, 1024) <= 0 ) { 47 fprintf(stderr, "error: reading a request.\n"); 48 } 49 else { 50 sscanf(buf, "%s %s %s", meth_name, uri_addr, http_ver); 51 if (strcmp(meth_name, "GET") != 0) { 52 send_msg(sockfd, "501 Not Implemented"); 53 } 54 else { 55 uri_file = uri_addr+1; 56 if ((read_fd = open(uri_file, O_RDONLY, 0666)) == -1) { 57 send_msg(sockfd, "404 Not Found"); 58 } 59 else { 60 send_msg(sockfd, "HTTP/1.0 200 OK\r\n"); 61 send_msg(sockfd, "text/html\r\n"); 62 send_msg(sockfd, "\r\n"); 63 while((len = read(read_fd, buf, 1024)) > 0) { 64 if (write(sockfd, buf, len) != len) { 65 fprintf(stderr, "error: writing a response.\n"); 66 break; 67 } 68 } 69 close(read_fd); 70 } 71 } 72 } 73} 74 75void httpd(int sockfd); 76 77int send_msg(int fd, char *msg); 78 79 80 81int main() 82{ 83 84 int sockfd, new_sockfd; 85 86 int writer_len; 87 88 struct sockaddr_in reader_addr, writer_addr; 89 90 bzero((char *) &reader_addr, sizeof(reader_addr)); 91 92 reader_addr.sin_family = AF_INET; 93 94 reader_addr.sin_addr.s_addr = htonl(INADDR_ANY); 95 96 reader_addr.sin_port = htons(HTTP_TCP_PORT); 97 98 99 100 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 101 102 fprintf(stderr, "error: socket()\n"); 103 104 exit(1); 105 106 } 107 108 109 const int yes=1; 110 setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); 111 112 if (bind(sockfd, (struct sockaddr *)&reader_addr, sizeof(reader_addr)) < 0) { 113 fprintf(stderr, "error: bind()\n"); 114 strerror(errno); 115 close(sockfd); 116 117 exit(1); 118 119 } 120 121 122 123 if (listen(sockfd, 5) < 0) { 124 125 fprintf(stderr, "error: listen()\n"); 126 127 close(sockfd); 128 129 exit(1); 130 131 } 132 133 134 135 while(1) { 136 137 if ((new_sockfd 138 139 = accept(sockfd,(struct sockaddr *)&writer_addr, &writer_len)) < 0) { 140 141 fprintf(stderr, "error: accepting a socket.\n"); 142 143 break; 144 145 } 146 147 else { 148 149 http(new_sockfd); 150 151 close(new_sockfd); 152 153 } 154 155 } 156 157 close(sockfd); 158}
長くてすみません。
実行結果
T119> main(); T119> memset("", 0, 16); T119> return 0x7e97ffe4; //from memset T119> socket(2, 1, 0); T119> return 61; //from socket T119> setsockopt(61, 1, 2, 0x7e97ffd0, 4); T119> return 0; //from setsockopt T119> bind(61, 0x7e97ffe4, 16); T119> return -1; //from bind T119> fprintf(0xb6cf74cc, "error: bind()\n"); error: bind() T119> return 14; //from fprintf T119> __errno(); T119> return 0x89835980; //from __errno T119> strerror(13); T119> return "Permission denied"; //from strerror T119> close(61); T119> return 0; //from close T119> exit(1); Program exit with code : 1.
どうすれば良いのでしょうか?
回答1件
あなたの回答
tips
プレビュー