TCP/IP通信型大文字・小文字変換プログラムを作りたいです。
しかし、うまく2つのプログラムが接続されません。
恐らく、IPアドレスやホスト名の問題だと思います。
超初心者でそこのところをあまり理解していません。
どなたかプログラムの補足をお願いします。
概要は
・クライアント
キーボードから文字列を入力し、サーバーに送信。
サーバーから送信された文字列を画面に出力。
・サーバー
クライアントから送信された文字列に対し、
大文字は小文字に、小文字は大文字に変換して返す。
クライアント側プログラム
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define SOCK_NAME "./socket"
int main()
{
struct sockaddr_in saddr;
int soc;
char buf[1024];
if ( (soc =socket(AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
perror("socket");
exit(1);
}
memset((char *)&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr=inet_addr("192.168.1.1");
saddr.sin_port=htons(1357);
if(connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
perror("connect");
exit(1);
}
fprintf(stderr, "Connection established: socket %d used.\n", soc);
while(fgets(buf, 1024, stdin)){
if(buf[strlen(buf) -1] == "\n") buf[strlen(buf) -1] = "\0";
write(soc, buf, 1024);
read(soc, buf, 1024);
fprintf(stdout, "%s\n", buf);
}
close(soc);
return 0;
}
サーバー側プログラム
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SOCK_NAME "./socket"
int main()
{
int i;
int fd1, fd2;
struct sockaddr_in saddr;
struct sockaddr_in caddr;
int len;
int ret;
char buf[1024];
if((fd1 =socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
perror("socket");
exit(1);
}
memset((char *)&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr=INADDR_ANY;
saddr.sin_port=htons(1357);
unlink(SOCK_NAME);
if(bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
perror("bind");
exit(1);
}
if(listen(fd1,5) < 0 ) {
perror("listen");
exit(1);
}
while(1){
len = sizeof(caddr);
if((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0){
perror("accept");
exit(1);
}
fprintf(stderr, "Connection established: socket %d used.\n", fd2);
while((ret = read(fd2, buf, 1024)) > 0 ){
fprintf(stderr, "read: &s\n", buf);
for(i=0; i<ret; i++)
if(islower(buf[i]))
buf[i] = toupper(buf[i]);
if(isupper(buf[i]))
buf[i] = tolower(buf[i]);
fprintf(stderr, "write: %s\n", buf);
write(fd2, buf, 1024);
}
close(fd2);
}
close(fd1);
return 0;
}
No.2
- 回答日時:
ネットワークプログラムの初歩的な部分には
特に問題なさそうな気がします。
#一応、htonl(INADDR_ANY);のほうがいいかな
接続先を確認するか、ネットワーク構成を
確認したほうが良いと思います。
あと、コーティングにいくつかまずい点があります。
{}をつけたりつけなかったりするのは
よくありません。
つけるなら付けるきちっとしないと、
次のようなバグが出ます。
for(i=0; i<ret; i++)//括弧がないから次の一行に反映
if(islower(buf[i])) //括弧がないから次の一行に反映
buf[i] = toupper(buf[i]);//ここまでループ対象
//ループ終了。
if(isupper(buf[i]))//今回のプログラムでretが1024ならアクセス違反
buf[i] = tolower(buf[i]);
No.1ベストアンサー
- 回答日時:
クライアント側でIPアドレスとして 192.168.1.1を指定していますけど
これはあってますか?
プログラムにバグがあったので、それを修正した上で
ループバックアドレス(127.0.0.1)を指定して試したところ
うまく動作しました。
いきなりサーバーとクライアント両方を試すより、
サーバーは正しく動くのか、
クライアントは正しく動くのか
をそれぞれ試すようにした方がよくはないですか。
サーバーのテストなら telnetでも試せますし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Win32APIでのエディットボック...
-
'const char *' 型は 'char *' ...
-
全角文字を含んだ文字の並びを...
-
C言語の入力した文字を反転させ...
-
charでの計算?
-
strchr() の第2引数はなぜ int ...
-
宣言による処理の重さ
-
C言語 バイナリファイルをfloa...
-
fgetsなどのときのstdinのバッ...
-
文字列の中から必要なデータを...
-
strncpyと_tcsncpy_sのヌルの扱...
-
puts関数やら
-
配列をnビットシフトする
-
型変換
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
下記のプログラムがコンパイラ...
-
英単語をアルファベット順に
-
C言語のポインターで詰まっている
-
c言語の問題の説明、各所ごとに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報