チャットプログラムを作っています。
Posted: 2013年10月30日(水) 20:48
udpでチャットプログラムを作っています。
複数人でチャットが出来るようにしたいです。
実行すると、Can't assign requested addressというエラーが出てしまいます。
どうしたら解決できるでしょうか?
複数人でチャットが出来るようにしたいです。
実行すると、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);
}