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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

16165閲覧

セグメンテーション違反(コアダンプ)がでます

shanso

総合スコア14

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2015/06/15 05:15

編集2015/06/15 05:19

以下のコードを./のみで実行するとセグメンテーション違反が出ます
valgrind ./で実行するとセグメンテーション違反が出ません

//Linux gcc での TCP/IP サンプルプログラム(ここからサーバー)
//クライアントから送られてきた文字列を大文字に変換して送り返す
//サーバープログラムを実行してからクライアントプログラムを実行して下さい

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 9876 //クライアントプログラムとポート番号を合わせてください

int main(){
int i;
int srcSocket; //自分
int dstSocket; //相手
// sockaddr_in 構造体
struct sockaddr_in srcAddr;
struct sockaddr_in dstAddr;
int dstAddrSize = sizeof(dstAddr);
// 各種パラメータ
int status;
int numrcv;
char buf[1024];

while(1){//ループで回すことによって何度でもクライアントからつなぐことができる
// sockaddr_in 構造体のセット
bzero((char *)&srcAddr, sizeof(srcAddr));
srcAddr.sin_port = htons(PORT);
srcAddr.sin_family = AF_INET;
srcAddr.sin_addr.s_addr = INADDR_ANY;

// ソケットの生成(ストリーム型) srcSocket = socket(AF_INET, SOCK_STREAM, 0); // ソケットのバインド bind(srcSocket, (struct sockaddr *)&srcAddr, sizeof(srcAddr)); // 接続の許可 listen(srcSocket, 1); // 接続の受付け printf("接続を待っています\nクライアントプログラムを動かして下さい\n"); dstSocket = accept(srcSocket, (struct sockaddr *)&dstAddr, &dstAddrSize); printf("%s から接続を受けました\n",inet_ntoa(dstAddr.sin_addr)); close(srcSocket); while(1){ //パケットの受信 numrcv = read(dstSocket, buf, 1024); if(numrcv ==0 || numrcv ==-1 ){ close(dstSocket); break; } printf("変換前 %s",buf); for (i=0; i< numrcv; i++){ // bufの中の小文字を大文字に変換 if(isalpha(buf[i])) buf[i] = toupper(buf[i]); } // パケットの送信 write(dstSocket, buf, 1024); fprintf(stdout,"→ 変換後 %s \n",buf); }

}
return(0);
}

////////////////////////////////////////////////////////////////////////////////////////
//Linux gcc での TCP/IP サンプルプログラム(ここからはクライアント)
//入力されたデータをクライアントに送り,もらったデータを表示する
//サーバープログラムを実行してからクライアントプログラムを実行して下さい

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define PORT 9876 //サーバープログラムとポート番号を合わせてください

int main(){
// IP アドレス,ソケット,sockaddr_in 構造体
char destination[32];
int dstSocket;
struct sockaddr_in dstAddr;

//struct sockaddr_in addr;
struct hostent *hp;
char buf[1024];
int numrcv;

// 相手先アドレスの入力と送る文字の入力
printf("サーバーマシンのIPは?:");
scanf("%s", destination);

//sockaddr_in 構造体のセット
bzero((char *)&dstAddr, sizeof(dstAddr));
dstAddr.sin_family = AF_INET;
dstAddr.sin_port = htons(PORT);

hp = gethostbyname(destination);
bcopy(hp->h_addr, &dstAddr.sin_addr, hp->h_length);

//ソケットの生成
dstSocket = socket(AF_INET, SOCK_STREAM, 0);

//接続
if (connect(dstSocket, (struct sockaddr *)&dstAddr, sizeof(dstAddr)) < 0){
printf("%s に接続できませんでした\n",destination);
return(-1);
}
printf("%s に接続しました\n",destination);
printf("適当なアルファベットを入力してください\n");

while (1){
scanf("%s",buf);
//パケットの送信
write(dstSocket, buf, 1024);
//パケットの受信
numrcv = read(dstSocket, buf, 1024);
printf("→ %s\n\n",buf);
}
close(dstSocket);
return(0);
}

サーバを起動しクライアントから接続はできるのですが
接続直後にセグメンテーション違反(コアダンプ)がでてしまいます
どこにエラーがあるのでしょうか?
お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

試しに動かしてみましたが、特に問題無く動作しました。
クライアント側で、相手先アドレスの入力で変な値を入れると、セグメンテーションフォールトしたぐらいです。
socket,bind,listen,gethostbyname、あたりのエラーチェックはちゃんとしたほうが良いかと思います。

接続直後にセグメンテーション違反というのは、具体的には "%s に接続しました\n" が出力された後ですか?

投稿2015/06/15 05:50

takutok

総合スコア392

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

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

shanso

2015/06/15 06:08

"%s に接続しました\n"が表示された後にセグメンテーション違反が表示されます
shanso

2015/06/16 03:57

ありがとうございます 無事に動きました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問