[解決済み] Connect: ソケット以外でのソケット操作
2022-01-20 17:49:30
質問
Unixネットワークプログラミングの初心者なのですが、Googleのサーバーに接続するプログラムを書いてみました。しかし、connect()関数を使用しているときにエラーが発生しました。(OS: OS X)
接続エラーです。非ソケットでのソケット操作
4時間ほどやってみたのですが、問題が見つかりませんでした。以下は私のコードです。
#define SERVPORT 80
int main (int argc, char **argv)
{
int i, sockfd;
struct hostent *host;
struct sockaddr_in serv_addr;
if ( (host = gethostbyname(argv[1])) == NULL) {
printf("gethostbyname error\n");
exit(1);
}
for (i = 0; host->h_addr_list[i]; i++) {
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1)) {
printf("socket error\n");
exit(1);
}
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVPORT);
serv_addr.sin_addr = *( (struct in_addr *)host->h_addr_list[i]);
const char *ip = inet_ntoa(serv_addr.sin_addr);
printf("connect to %s\n", ip);
if (connect(sockfd, (struct sockaddr *) &serv_addr,
sizeof(struct sockaddr)) == -1) {
printf("connect error:%s\n", strerror(errno));
exit(1);
}
}
return 0;
}
解決するには?
問題がわかりました。 それはこの行です。
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1))
演算子は==演算子より優先されます。 socket(...) == -1 という真偽値を代入された結果、sockfd は "0" に初期化されています。
ソケットの初期化をこのように変更します。
for (i = 0; host->h_addr_list[i]; i++)
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
printf("socket error\n");
exit(1);
}
あるいは、同じ行に「代入して比較する」というやり方がお好みなら、こう言うこともできるかもしれません。
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
微妙な違いに注目してください。
関連
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み] シェルスクリプトで整数比較のための論理和演算を行うには?
-
[解決済み】close vs shutdown socket?
最新
-
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 - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?