お願いします><><
Posted: 2007年2月04日(日) 00:35
大学の課題でどぉしても、わからないところがあります。。
システムプログラミングというC言語の授業なんですが、
UDPでチャットを作りなさい。という問題です。
なんとか普通のものはできたのですが、オプション機能を付け加えることが
できません><
分かる方いらしたら、お願いします><
UDPを利用したチャットシステムを作りなさい。
プロトコル
パケットの先頭の一文字はパケットの種類を表す。
C→S S→C 引数
i login 開始 ユーザが入室 ニックネーム
o logout 終了 ユーザが退室 ニックネーム
m message 発言 他のユーザの発言 メッセージ
e error エラー エラー エラーのあった行
すべての通信は行単位で行う。
1文字目は上記のいずれか
2文字目からが引数の内容
サーバの動作
起動時に標準入出力、標準エラー出力は閉じる。停止はシグナルで行う。 SIGINTを受け取ったら、全員に停止メッセージを送って終了する。
i 登録し、入室情報を全員に通知同一ニックネームを使っている場合は(1)のように番号を後につける
o 登録を削除し、退室情報を全員に通知
m メッセージを全員に通知
クライアントの動作
起動時に login プロトコルをサーバに送る
終了時に logout プロトコルをサーバに送る
ユーザがキーボードから入力したメッセージはサーバに送る。行単位で処理。
サーバから送られてきたメッセージは画面に表示
クライアントはこちらです。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
main(int argc, char *argv[/url]) {
int s;
struct sockaddr_in my_addr, server;
int serverlen, nc;
struct hostent *host;
char buf[1024];
serverlen = sizeof(server);
s = socket(AF_INET, SOCK_DGRAM, 0);
if(s<0) error("socket");
host = gethostbyname(argv[1]);
if(host==NULL) error("gethostbyname");
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(8000);
memcpy(&server.sin_addr, host->h_addr,host->h_length);
fgets(buf, 1023, stdin);
while(buf[0]!='.') {
sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&server, sizeof(server));
memset(buf, 0, 1024);
nc = recvfrom(s, buf, 1023, 0, (struct sockaddr *)&server, &serverlen);
printf("%s", buf);
fgets( buf, 1023, stdin);
}
}
error(char *msg) { perror(msg); exit(1); }
サーバーはこちらです。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#define BUFMAX 256
#define PORT_NO 8000
char rmsg[10], smsg[BUFMAX];
int sofd;
struct sockaddr_in sv_addr, cl_addr;
error(char *msg) {
fprintf(stderr, "server- "); perror(msg); exit(1);
}
main() {
sofd = socket(AF_INET, SOCK_DGRAM, 0);
if(sofd<0)error("socket");
bzero((char *)&sv_addr, sizeof(sv_addr));
sv_addr.sin_family = AF_INET;
sv_addr.sin_port = htons(PORT_NO);
sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind (sofd,(struct sockaddr *) &sv_addr, sizeof(sv_addr))<0) error("bind");
servpro();
}
servpro() {
int cc, cadlen, nbyte, i;
char *msg[/url] = { "Hi.\n", "Bye.\n", ".\n", 0};
char buf[1024];
fd_set mask;
struct timeval to;
while(1) { // 無限ループ
FD_ZERO(&mask); //mask をクリア
FD_SET(sofd, &mask); //sofdのマスクをセット
to.tv_sec = 10; //タイムアウトの時間を設定
FD_SET(0, &mask); //標準入力のマスクをセット
if(select(sofd+1, &mask, NULL, NULL, &to)<0)error("select"); // 入力があるまで待つ
if(FD_ISSET(0, &mask)) { // 標準入力の場合
bzero(buf, 1024);
gets(buf);
if(buf[0]=='.') break;
printf("Key board: %s.\n",buf); // 自分に出力
cadlen = sizeof(cl_addr);
cc = recvfrom(sofd, rmsg, 10, 0,(struct sockaddr *) &cl_addr, &cadlen);
if(cc < 0) error("recvfrom");
if(sendto(sofd, buf, strlen(buf), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
sendto(sofd, "\n", 1, 0,(struct sockaddr *) &cl_addr, cadlen);
}
if(FD_ISSET(sofd, &mask)) { // ネットワークから送られてきた場合
cadlen = sizeof(cl_addr);
cc = recvfrom(sofd, rmsg, 10, 0,(struct sockaddr *) &cl_addr, &cadlen);
if(cc < 0) error("recvfrom");
if(sendto(sofd, rmsg, strlen(rmsg), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
/*
for(i=0; msg; i++) {
if(sendto(sofd, msg, strlen(msg), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
}
*/
}
}
}
長くなってすみません><
システムプログラミングというC言語の授業なんですが、
UDPでチャットを作りなさい。という問題です。
なんとか普通のものはできたのですが、オプション機能を付け加えることが
できません><
分かる方いらしたら、お願いします><
UDPを利用したチャットシステムを作りなさい。
プロトコル
パケットの先頭の一文字はパケットの種類を表す。
C→S S→C 引数
i login 開始 ユーザが入室 ニックネーム
o logout 終了 ユーザが退室 ニックネーム
m message 発言 他のユーザの発言 メッセージ
e error エラー エラー エラーのあった行
すべての通信は行単位で行う。
1文字目は上記のいずれか
2文字目からが引数の内容
サーバの動作
起動時に標準入出力、標準エラー出力は閉じる。停止はシグナルで行う。 SIGINTを受け取ったら、全員に停止メッセージを送って終了する。
i 登録し、入室情報を全員に通知同一ニックネームを使っている場合は(1)のように番号を後につける
o 登録を削除し、退室情報を全員に通知
m メッセージを全員に通知
クライアントの動作
起動時に login プロトコルをサーバに送る
終了時に logout プロトコルをサーバに送る
ユーザがキーボードから入力したメッセージはサーバに送る。行単位で処理。
サーバから送られてきたメッセージは画面に表示
クライアントはこちらです。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
main(int argc, char *argv[/url]) {
int s;
struct sockaddr_in my_addr, server;
int serverlen, nc;
struct hostent *host;
char buf[1024];
serverlen = sizeof(server);
s = socket(AF_INET, SOCK_DGRAM, 0);
if(s<0) error("socket");
host = gethostbyname(argv[1]);
if(host==NULL) error("gethostbyname");
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(8000);
memcpy(&server.sin_addr, host->h_addr,host->h_length);
fgets(buf, 1023, stdin);
while(buf[0]!='.') {
sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&server, sizeof(server));
memset(buf, 0, 1024);
nc = recvfrom(s, buf, 1023, 0, (struct sockaddr *)&server, &serverlen);
printf("%s", buf);
fgets( buf, 1023, stdin);
}
}
error(char *msg) { perror(msg); exit(1); }
サーバーはこちらです。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#define BUFMAX 256
#define PORT_NO 8000
char rmsg[10], smsg[BUFMAX];
int sofd;
struct sockaddr_in sv_addr, cl_addr;
error(char *msg) {
fprintf(stderr, "server- "); perror(msg); exit(1);
}
main() {
sofd = socket(AF_INET, SOCK_DGRAM, 0);
if(sofd<0)error("socket");
bzero((char *)&sv_addr, sizeof(sv_addr));
sv_addr.sin_family = AF_INET;
sv_addr.sin_port = htons(PORT_NO);
sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind (sofd,(struct sockaddr *) &sv_addr, sizeof(sv_addr))<0) error("bind");
servpro();
}
servpro() {
int cc, cadlen, nbyte, i;
char *msg[/url] = { "Hi.\n", "Bye.\n", ".\n", 0};
char buf[1024];
fd_set mask;
struct timeval to;
while(1) { // 無限ループ
FD_ZERO(&mask); //mask をクリア
FD_SET(sofd, &mask); //sofdのマスクをセット
to.tv_sec = 10; //タイムアウトの時間を設定
FD_SET(0, &mask); //標準入力のマスクをセット
if(select(sofd+1, &mask, NULL, NULL, &to)<0)error("select"); // 入力があるまで待つ
if(FD_ISSET(0, &mask)) { // 標準入力の場合
bzero(buf, 1024);
gets(buf);
if(buf[0]=='.') break;
printf("Key board: %s.\n",buf); // 自分に出力
cadlen = sizeof(cl_addr);
cc = recvfrom(sofd, rmsg, 10, 0,(struct sockaddr *) &cl_addr, &cadlen);
if(cc < 0) error("recvfrom");
if(sendto(sofd, buf, strlen(buf), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
sendto(sofd, "\n", 1, 0,(struct sockaddr *) &cl_addr, cadlen);
}
if(FD_ISSET(sofd, &mask)) { // ネットワークから送られてきた場合
cadlen = sizeof(cl_addr);
cc = recvfrom(sofd, rmsg, 10, 0,(struct sockaddr *) &cl_addr, &cadlen);
if(cc < 0) error("recvfrom");
if(sendto(sofd, rmsg, strlen(rmsg), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
/*
for(i=0; msg; i++) {
if(sendto(sofd, msg, strlen(msg), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
}
*/
}
}
}
長くなってすみません><