質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

714閲覧

c言語でのサーバーの起動

yoyuhihami

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/04/16 07:47

困っていること

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.

どうすれば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/04/16 07:55

どうやってコンパイルや実行しようとしたのでしょうか? また、OS やコンパイラなどの環境もお書きください。
jimbe

2022/04/16 10:10

起動しないこととは関係ありませんが、 http サーバを模すのでしたらプロトコルぐらいは押さえておいたほうが良いと思います。
yoyuhihami

2022/04/16 13:31

追加で情報ですが実行環境はandroid6.3.5 コンパイラはモバイルCというアプリケーションです。
yoyuhihami

2022/04/18 09:17

ありがとうございました。
guest

回答1

0

ベストアンサー

通常、80番ポートは管理者権限でないと使えないようになっています。
もしLinuxなら sudo などで root 権限で実行しましょう。

投稿2022/04/16 07:57

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoyuhihami

2022/04/17 01:12

使うポート番号を変えるために使う引数や、変数はないのですか?
mather

2022/04/17 08:25

ご自身のコードをよく見直してみてください。 #define HTTP_TCP_PORT 80 と記述がありますよね?
yoyuhihami

2022/04/18 06:45

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問