#include <stdio.h> /* printf(),fprintf()に必要 /
#include <sys/socket.h> / socket(),connect(),send().recv()に必要 /
#include <arpa/inet.h> / sockaddr_in,inet_addr()に必要 /
#include <stdlib.h> / atoi(),system()に必要 /
#include <string.h> / memset()に必要 /
#include <unistd.h> / close()に必要 */
#define RCVBUFSIZE 32 /* 受信バッファサイズ */
void DieWithError(char *errorMessage){ /エラー処理関数/
printf("%s\n", errorMessage);
exit(1);
}
int main(int argc, char argv[]){
system("clear"); /画面をクリアする/
int sock; / ソケットディスクリプタ /
struct sockaddr_in ServAddr;/ エコーサーバのアドレス /
unsigned short ServPort; / エコーサーバのポート番号 */
char servIP; / サーバIPアドレス(ドット10進数) */
char echoString; / エコーサーバに送信する文字列 /
char Buffer[RCVBUFSIZE]; / エコー文字列用バッファ /
unsigned int echoStringLen; / エコーする文字列のサイズ /
int bytesRcvd, totalBytesRcvd; / 1回のrecv()で読み取れるバイト数と全バイト数 */
servIP = "xxx.xxx.xx.x"; /* サーバのIPアドレス(ドット10進数) */ ServPort = atoi("xx"); /* 指定のポート番号 */ //echoString = "1"; /* TCPによる信用性の高いストリームソケットを作成 */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ DieWithError("socket() failed");
}
/* サーバのアドレス構造体を作成 /
memset(&ServAddr, 0, sizeof(ServAddr)); / 構造体に0を埋める /
ServAddr.sin_family = AF_INET; / インターネットアドレスファミリ */
ServAddr.sin_addr.s_addr = inet_addr(servIP); /*サーバのIPアドレス /
ServAddr.sin_port = htons(ServPort); / サーバのポート番号 */
/* エコーサーバへの接続を確立 */ if (connect(sock, (struct sockaddr *) &ServAddr, sizeof(ServAddr)) < 0){ DieWithError("connect() failed");
}
printf("プログラム番号を入力してください : "); scanf("%s", echoString);/* エコー文字列入力待ち */ echoStringLen = strlen(echoString); /* 入力データの長さを調べる */ /* 文字列をサーバに送信 */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen){ DieWithError("send() sent a different number of bytes than expected");
}
/* 文字列をサーバから受信 */ totalBytesRcvd = 0; while (totalBytesRcvd < echoStringLen){/* バッファサイズに達するまで(NULL文字用の1バイトを除く)サーバからのデータを受信する */ if ((bytesRcvd = recv(sock, Buffer, RCVBUFSIZE - 1, 0)) <= 0){ DieWithError("recv() failed or connection closed prematurely"); } totalBytesRcvd += bytesRcvd; /* 総バイト数の集計 */ Buffer[bytesRcvd] = '\0' ; /* 文字列の終了 */ printf("%s",Buffer); /* エコーバッファの表示 */ } printf("\n"); /* 最後の改行を出力 */ close(sock); exit(0);
}
scanfで数字の「1」を入力すれば
このようなエラーメッセージが出ます。
[Segmentation fault: 11]
どのように解決するのでしょうか?
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/01 01:47