メッセージの送受信法が分かりません。
Posted: 2013年1月18日(金) 21:14
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:文字列送信成功
になるようにします。
今、記述しているプログラム文が下記の通りですが追加箇所以外にも間違いが御座いましたらご指摘お願いします。
誰か分かる方がいらっしゃいましたらプログラム文の記述をお願いします。
実行例が
*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;
}