メッセージの送受信法が分かりません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
toppo

メッセージの送受信法が分かりません。

#1

投稿記事 by toppo » 13年前

linuxでクライアントとサーバー間でメッセージを送受信する問題で、最初にサーバーからクライアントに向けてhello client!!とメッセージを送信してクライアントはサーバーから送られてきたメッセージを受け取りhello client!!をターミナルに表示します。次にクライアントからサーバーに向けてheloo server!!とメッセージを送信してサーバーはクライアントから送られてきたhello serverターミナルに表示させると言う問題です。コンパイラがgccでread関数とwrite関数を使用するのが条件なのですが丸六日粘っても全く出来ません。プログラムの追加箇所は分かっているのですが(プログラム上に記述します。)インターネットで調べてサンプルプログラムを参考にしても全く出来ません;;
誰か分かる方がいらっしゃいましたらプログラム文の記述をお願いします。


実行例が

*server*
1:ソケット生成成功
2:バインド成功
3:接続待機成功
4:接続受付成功
5:文字列送信成功
6:文字列受信成功: hello server!!

*client*
1:ソケット生成成功
2:サーバ接続成功
3:文字列受信成功: hello client
4:文字列送信成功

になるようにします。

今、記述しているプログラム文が下記の通りですが追加箇所以外にも間違いが御座いましたらご指摘お願いします。

コード:

//client側

#include<sys/socket.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<unistd.h>
int main(void){
int sockfd;
struct sockaddr_in servaddr;
int connfd;
int buff;

//ソケットの生成
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror("ソケット生成失敗");
exit(1);
}
else{
printf("1:ソケット生成成功\n");
}
//ソケットの設定
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(9000);
servaddr.sin_addr.s_addr=inet_addr("アドレス");
//サーバへの接続
connfd=connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if(connfd<0){
perror("サーバ接続失敗");
exit(1);
}
else{
printf("2:サーバ接続成功\n");
}
//↓メッセージの送受信(多分ここがプログラム文の追加箇所)↓




//↑ここまで↑


//ソケットを閉じる
close(sockfd);

return 0;
}

コード:

//server側

#include<sys/socket.h>
#include<arpa/inet.h>


int main(void){
int sockfd;
struct sockaddr_in servaddr;
int connfd;
int len;
int cliaddr;





//ソケットの生成
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror("ソケット生成失敗");
exit(1);
}
else{
printf("1:ソケット生成成功\n");
}
//ソケットの設定
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(9000);
servaddr.sin_addr.s_addr = INADDR_ANY;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, NULL, 0);

// ソケットに名前をつける
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
perror("バインド失敗");
exit(1);
}
else{
printf("2:バインド成功\n");
}
// 接続を待ち受ける
if(listen(sockfd, 5) < 0){
perror("接続待機失敗");
exit(1);
}
else{
printf("3:接続待機成功\n");
}
// 接続要求を受け付ける
len = sizeof(cliaddr);
connfd = accept(sockfd, (struct sockaddr *)&cliaddr, (socklen_t *)&len);
if(connfd < 0){
perror("接続受付失敗");
exit(1);
}
else{
printf("4:接続受付成功\n");
}
//↓メッセージの送受信(多分ここがプログラム文の追加箇所)



//↑ここまで↑


// ソケットを閉じる
close(sockfd);
return 0;
} 
 

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: メッセージの送受信法が分かりません。

#2

投稿記事 by beatle » 13年前

toppo さんが書きました:丸六日粘っても全く出来ません。
出来ません、とはどういう意味でしょう?
調べたサンプルプログラムを組み込んでも何かエラーが出るのか、サンプルプログラムが理解できないのか、そもそもC言語自体が怪しいのか。
何をどう「粘った」のか教えていただけますか?

それから、インデント(字下げ)ってご存知です?
インデントが下手だとバグが出やすいので直しましょう。
投稿前チェックリスト

ゲスト

Re: メッセージの送受信法が分かりません。

#3

投稿記事 by ゲスト » 13年前

不適切な内容だったので削除しました。

toppo

Re: メッセージの送受信法が分かりません。

#4

投稿記事 by toppo » 13年前

ご指摘の通り、インテンドのやり方も余り良く分かっていないC言語が怪しい所か全くの初心者です。
フローチャートを理解するのも結構苦労している程です。
送受信に関するサンプルプログラムは調べると沢山あったので自分が今組み込んでいるプログラムと近いサンプルプログラムを参考にしてwhile文やif文を使用してread(scokfd,buff,sizeof(buff))や送信するメッセージをコピーするsyrcpy関数を使用してコンパイルしているのですがlinux上ですとエラーメッセージが英語で何が原因かも分からず、いくつかのサンプルプログラムを改良しては削除をしてやり直しの繰り返しをしている状況です。
サンプルプログラムと自分が組み込んでいるプログラムとの相性が悪くてエラーが起こっているのかも知れませんがそれすらも良く分かりません;;

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メッセージの送受信法が分かりません。

#5

投稿記事 by softya(ソフト屋) » 13年前

少なくとも課題がsocketまで到達しているなら一年ぐらいはC言語の講義を受けていると思います。
なので、コンパイルエラーにも散々今までぶち当たってきたはずですが、gccは始めてなのでしょうか?

それと、そのエラーの問題のあるプログラムとエラーメッセージを提示していただけませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る