我有一個像服務器一樣工作的程序(listen()
s,bind()
s和accept()
來自其他IP中相同程序的多個連接),並且同時將用戶輸入如UNIX shell。管理連接到多個主機的套接字
用戶輸入用於命令,並且有一個命令CONNECT
帶有地址和端口號規範。
我想讓它連接到多個主機,我想我必須爲每個連接使用一個套接字。
當我在CONNECT
用戶請求上創建套接字時,如何管理這些套接字?
我應該使用全局套接字array
,並在創建連接時創建並添加套接字?
我有一個像服務器一樣工作的程序(listen()
s,bind()
s和accept()
來自其他IP中相同程序的多個連接),並且同時將用戶輸入如UNIX shell。管理連接到多個主機的套接字
用戶輸入用於命令,並且有一個命令CONNECT
帶有地址和端口號規範。
我想讓它連接到多個主機,我想我必須爲每個連接使用一個套接字。
當我在CONNECT
用戶請求上創建套接字時,如何管理這些套接字?
我應該使用全局套接字array
,並在創建連接時創建並添加套接字?
我假設你想管理服務器中的多個客戶端。對?
所以,你必須採取插槽一些預定義的陣列,同時將服務於每一個
前。
long accept_sock[10];//This should be global
//initilize it with -1 at entry point
while(1)
{
struct sockaddr client; /* for BSDish accept() call */
int clientsize;
clientsize = sizeof(struct sockaddr_in);
long sock ;
for(int i=0;i<10;i++)
{
if(accept_sock[i] == -1)
{
sock= accept(server_sock, &client, &clientsize);
if(sock != -1)
{
acepct_sock[i] =sock;
break;
}
}
}
for(int i=0;i<10;i++)
{
if(accept_sock[i] != -1)
{
//do process
}
}
}
I think you need Concurrent Servers.There are two main classes of servers, iterative and concurrent. An iterative server iterates through each client, handling it one at a time. A concurrent server handles multiple clients at the same time. The simplest technique for a concurrent server is use select/fork().
#define FD_SETSIZE 20 /* MAX number of client */
for (i = 0; i < FD_SETSIZE; i++)
client[i] = -1;
FD_ZERO(&allset);
FD_SET(listenfd, &allset);
for (; ;) {
rset = allset;
nready = select(maxfd+1, &rset, NULL, NULL, NULL);
if (FD_ISSET(listenfd, &rset)) { /* new client connection */
printf("listening socket readable\n");
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
for (i = 0; i < FD_SETSIZE; i++)
if (client[i] < 0) {
client[i] = connfd; /* save descriptor */
break;
}
if (i == FD_SETSIZE)
printf("too many clients");
FD_SET(connfd, &allset); /* add new descriptor to set */
if (connfd > maxfd)
maxfd = connfd; /* for select */
if (i > maxi)
maxi = i; /* max index in client[] array */
if (--nready <= 0)
continue; /* no more readable descriptors */
}
for (i = 0; i <= maxi; i++) { /* check all clients for data */
if ((sockfd = client[i]) < 0)
continue;
if (FD_ISSET(sockfd, &rset)) {
/* do process */
}
}
}
郵編大約什麼都你試過至今。 – 2014-09-11 05:09:58
是的,這將是棘手。您將需要每個套接字的線程或主select()在多個套接字上等待。 – 2014-09-11 05:13:58
我正在使用'select()'來管理已接受()'接受的連接。我需要一種方法來管理連接()連接到的主機的套接字。 – user2418202 2014-09-11 05:19:36