チャットプログラムを作っています。

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

チャットプログラムを作っています。

#1

投稿記事 by ニャンタ » 12年前

udpでチャットプログラムを作っています。
複数人でチャットが出来るようにしたいです。
実行すると、Can't assign requested addressというエラーが出てしまいます。
どうしたら解決できるでしょうか?

コード:

#include  <stdio.h>
#include  <stdlib.h>
#include  <unistd.h>
#include  <netdb.h>
#include  <string.h>
#include  <sys/socket.h>
#include  <netinet/in.h>
#include  <arpa/inet.h>
#define MAX_CLIENT 10/* 接続要求を受け付ける数 */
#define BUF 65550
#define PORT 5320
#define HOST "127.0.0.1"//自分のパソコンで動作確認するため

struct Member{
	struct sockaddr_in client;
	char name[64];
};
int main()
{
	struct sockaddr_in server;//サーバの構造体宣言
	struct sockaddr_in box;//クライアントの情報を格納する
	int port, server_socket,client_socket, rn,sn,len;
	char recv_buf[BUF];//受信のバッファの大きさ
	char send_buf[BUF];//送信のバッファの大きさ
	struct Member member[MAX_CLIENT];
	socklen_t sockaddr_in_size=sizeof(struct sockaddr_in);	
	

	fd_set rfds;
    int accessible;
	int maxfd=-1;
	struct timeval tv;
	
	int count=0;//接続してきたクライアントの数
	int i;//for文を回すための変数
	int len2;
	int status;
	char hassin[BUF];
	
	//タイムアウトの時間を設定
	tv.tv_sec = 5;
	tv.tv_usec = 0;
	
	port=PORT;
	
	//サーバー用ソケット作成
	if((server_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}
	
	//サーバーの準備
	memset((char *) &server, 0, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = htonl(INADDR_ANY);
	server.sin_port = htons(port);
	if(bind(server_socket, (struct sockaddr *) &server, sizeof(server)) < 0) {
		perror("bind");
		exit(1);
	}

	FD_ZERO(&rfds);
    FD_SET(0, &rfds);
	//ret = select (maxfd + 1, &fds, NULL, NULL, &tv);
	FD_SET (server_socket, &rfds);
	if(maxfd<server_socket){
		maxfd=server_socket;
	}
	
	while(1){
		accessible = select(FD_SETSIZE, &rfds, NULL, NULL, &tv);
		if(accessible < 0){//エラーの時
			perror("select()");
			exit(EXIT_FAILURE);
		}
		else if(accessible==0){//timeout
			exit(0);
		}
		else{
			if(FD_ISSET(server_socket, &rfds)){
				struct sockaddr csa;
				socklen_t l;
				if( ( rn = recvfrom(server_socket, recv_buf, BUF-1, 0, (struct sockaddr *)&box, &sockaddr_in_size) ) < 0 ) {
					perror("recvfrom() ");
					fprintf(stderr, "something wrong.\n");
					exit(1);
				}
				recv_buf[rn] = '\0';
				printf("%s\n",recv_buf);
				
				if(count!=0){
					for(i=0; i<MAX_CLIENT; i++) {
						member[i].client.sin_family = box.sin_family;
						member[i].client.sin_addr.s_addr =box.sin_addr.s_addr ;
						member[i].client.sin_port = box.sin_port;
						count++;
					}
				}
				strcpy(hassin,recv_buf);
			}
		}
		sn=strlen(hassin);
		for(i=0; i<MAX_CLIENT; i++){
			len2=sizeof(member[i].client);
			if(sendto(server_socket, send_buf, sn, 0, (struct sockaddr *) &member[i].client, len2) < 0) {
				perror("sendto");
				status=close(server_socket);
				exit(1);
			}
		}
	}
	exit(EXIT_SUCCESS);
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: チャットプログラムを作っています。

#2

投稿記事 by みけCAT » 12年前

同じマシンで2個以上のサーバーを立てようとしてエラーになっているというわけではないですか?
もしそうだとしたら、解決策は「コマンドラインかなんかでサーバーを立てるか選べるようにする」だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: チャットプログラムを作っています。

#3

投稿記事 by みけCAT » 12年前

コード:

server.sin_addr.s_addr = htonl(INADDR_ANY);
ではなくて

コード:

server.sin_addr.s_addr = INADDR_ANY;
の方がいいと思います。

参考:http://www.geekpage.jp/programming/linu ... rk/udp.php
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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