select()
機能を使用して複数のサーバーとの接続を確立できるクライアント機能を実装しようとしています。しかし、私はselect()
機能を使用する専門家ではありません。 しかし、クライアントは複数のサーバーとの接続を有効にできますが、複数のサーバーからのメッセージを読み取ることができませんでした。ソケットクライアントを選択
次の例では、クライアントを2台のサーバー(192.168.100.136, 192.168.100.138)
で接続しました。 は、これら二つのサーバに接続した後、私のクライアントではなく、複数のサーバからメッセージを受信する、唯一のサーバー(192.168.100.136
)からメッセージを受信していた。..
私は私のサンプルプログラムでselect()
機能を使用方法についてはよく分かりません。 事前に おかげ
int main()
{
int port = 10001 ;
char ip[][32] = {"192.168.100.136","192.168.100.138"};
int count = 2 ;
int ret = clientSelect(ip,port,count);
return 0 ;
}
int clientSelect(char **ipAddr ,int port , int count)
{
SOCKET max_sd = 0;
SOCKET socketId[10] = {0};
SOCKET sd = 0 ;
SOCKET client_sock[1024] = {0} ;
fd_set readfds;
int i ,j , ret;
char recvBuf[1024] = "";
char errMsg[256] = "" ;
struct sockaddr_in server ;
FD_ZERO(&readfds);
// Socket Initialization
for(i = 0; i<count ; i++)
{
ret = initSocket(&socketId[i]);//Small function to create socket
if (ret != 1)
{
return ret ;
}
//Server info
server.sin_addr.s_addr = inet_addr(ipAddr[i]);
server.sin_family = AF_INET;
server.sin_port = htons(port);
// Conect to server
if (connect(socketId[i], (struct sockaddr *)&server , sizeof(server)) < 0)
{
printf("connect ::Failed to connect to server %s:%d",ipAddr[i],port);
return -1;
}
// Set Socket fd
FD_SET(socketId[i], &readfds);
max_sd = (max_sd>socketId[i])?max_sd:socketId[i];
}
while(TRUE)
{
ret = select(max_sd + 1, &readfds, NULL, NULL, NULL);
if (ret < 0)
{
printf("select failed\n ");
return -1;
}
for (j = 0 ; j<max_sd ; j++)
{
sd = client_sock[j] ;
if (FD_ISSET(sd, &readfds))
{
ret = recv(sd,(char *)recvBuf,sizeof(recvBuf), 0);
if(ret > 0)
{
printf("Message received from socket %d : %s\n",sd,recvBuf);
send(sd,(char *)recvBuf,strlen(recvBuf),0);
}
}
}
}
return ret ;
}
未定義の動作:
あなたのコードは次のようにする必要があります。あなたのコンパイラは、 'main'に' clientSelect'の宣言がないことについて文句を言います。 – Olaf
無意味なスリープを取り除き、 'recv()'が0または-1を正しく返すケースを処理し、 'send()' -1を返す。そして 'strlen(recvBuf)'は 'ret'でなければなりません。あなたが実際に何を求めているのか不明です。 – EJP
それはCかC++ですか?彼らは異なる言語です。一つを選ぶ! – Olaf