Q&A
以下のコードを./のみで実行するとセグメンテーション違反が出ます
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);
}
サーバを起動しクライアントから接続はできるのですが
接続直後にセグメンテーション違反(コアダンプ)がでてしまいます
どこにエラーがあるのでしょうか?
お願いします。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2015/06/15 06:08
2015/06/15 07:01
2015/06/16 03:57