[解決済み] C言語でのソケット以外のエラー時のソケット操作
2022-02-18 04:19:10
質問
私はソケットプログラミングの初心者です... このサーバーサイドのプログラムを試してみました
#define BUFLEN 512
#define MYPORT 3456
void errorp(char* msg)
{
perror(msg);
exit(1);
}
int main()
{
struct sockaddr_in server, client;
int sock;
int slen = sizeof(server);
int clen = sizeof(client);
char *recvbuf, senbuf[BUFLEN] = {'h','e','l','l','o'};
if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))
errorp("Socket creation failed");
printf("To the client: %s, %s", senbuf, " World");
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = MYPORT;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(sock, (struct sockaddr*)&server, slen)==-1)
errorp("Socket Bind Failed");
if(recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*) &client, &clen) == -1)
errorp("recv from error");
printf("From the client: %s", recvbuf);
if(sendto(sock, senbuf, sizeof(senbuf), 0, (struct sockaddr*) &client, sizeof(client)) == -1)
errorp("Error in sending");
printf("To the client: %s", senbuf);
close(sock);
return 0;
}
コンパイルエラーはありませんが、出力は
Socket Bind Failed: Socket operation on non-socket
To the client: hello, World
どこが間違いなのか、ご教授ください。 そして、それを取り除く手助けをしてください。
解決方法は?
エラーメッセージが全てを物語っています。ソケットが(有効な)ソケットではありません。
これで、ソケットを作成するコードに目を向けるようになるはずです。
if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))
上記のコードでは、1回目に
socket()
を
-1
と比較し、その結果を
sock
. つまり、次のどちらかです。
0
または
1
. そして、その呼び出しの結果
socket()
が失われる。
このようなコードにする。
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
として
==
は、より強固に結合されます。
=
.
ちなみに ヨーダコンディトライ があれば、このようなtypo"typo;は避けられたと思います。
if (-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0)))
また、少なくとも
clen
は型でなければならない
socklen_t
のアドレスが渡され、そこに値が書き込まれるのですが、もし期待されるサイズの
socklen_t
とは異なります。
int
(表示されたコードはパスします)。
関連
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】strcmpが機能しない
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】malloc():メモリ破壊
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み] 未定義、未指定、および実装で定義された動作