Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多套接字侦听Linux套接字编程_C_Linux_Sockets_Networking_Port - Fatal编程技术网

C 多套接字侦听Linux套接字编程

C 多套接字侦听Linux套接字编程,c,linux,sockets,networking,port,C,Linux,Sockets,Networking,Port,这是我编写的一个简单代码。服务器响应端口2923、2924和2925上的连接 当我运行程序时,服务器仅从端口2923接收连接。有人能帮帮我吗。谢谢 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/ty

这是我编写的一个简单代码。服务器响应端口2923、2924和2925上的连接

当我运行程序时,服务器仅从端口2923接收连接。有人能帮帮我吗。谢谢

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>

void handle_client(int cliend_fd)
{

  int ret = accept(cliend_fd, NULL, 0);
  if (ret < 0)
  {
    printf("Accept Error\n");
  }

  else
  {
    printf("Client Accepted\n");
    shutdown(ret, 2);
  }
}

int main()
{
  int count = 3;
  int PORT = 2923;

  struct sockaddr_in address;
  int MasterSocket[count];
  int i = 0;
  fd_set readfds;

  int maxfd;
  maxfd = -1;
  int SelectSession;

  struct timespec TimeOut;
  TimeOut.tv_sec = 2;
  TimeOut.tv_nsec = 2;

  for (i = 0; i < count; i++)
  {
    MasterSocket[i] = socket(AF_INET, SOCK_STREAM, 0);
  }

  for (i = 0; i < count; i++)
  {
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("127.0.0.1");
    address.sin_port = PORT + i;
    if (bind(MasterSocket[i], (struct sockaddr *) &address, sizeof(address))
        < 0)
    {
      perror("Bind\n");
      getchar();
    }

    printf("SockerDesriptor %d---bind %d\n", MasterSocket[i], PORT + i);
  }

  for (i = 0; i < count; i++)
  {
    if (listen(MasterSocket[i], 4) < 0)
    {
      perror("Listen");
      getchar();
      //return 1;
    }
    else
    {
      printf("Listening on Port %d---\n", PORT + i);
    }
  }

  while (1)
  {
    FD_ZERO(&readfds);
    int status;

    for (i = 0; i < count; i++)
    {
      FD_SET(MasterSocket[i], &readfds);
      if (MasterSocket[i] > maxfd)
      {
        maxfd = MasterSocket[i];
      }
      printf("%d Added to FD_SET Descriptor %d \n\n", PORT + i,
          MasterSocket[i]);
    }

    //status = 0;
    printf("############Waiting for Connection\n");
    status = pselect(maxfd + 1, &readfds, NULL, NULL, &TimeOut, NULL );
    if (status < 0)
    {
      perror("Status");
      getchar();
      return 1;
    }

    else if (status == 0)
    {
      printf("TimeOut occured\n");
    }

    else
    {
      //printf("Status %d\n", status);
      SelectSession = -1;
      for (i = 0; i < count; i++)
      {
        //printf("Checking Set %d\n", i);
        if (FD_ISSET(MasterSocket[i], &readfds))
        {
          //printf("Matching Set %d\n", i);
          SelectSession = MasterSocket[i];
          printf("SelectSession %d\n", MasterSocket[i]);
          if (SelectSession == -1)
          {
            //shutdown (MasterSocket[i], 2);
            //continue;
            break;
          }
          else
          {
            printf("In Handle\n");
            handle_client(SelectSession);
            getchar();
          }

        }
        else
        {
          printf("Not in FD_ISSET\n");

        }
      }
    }

    /*for (i=0; i<count; i++)
     {
     shutdown (MasterSocket[i], 2);
     }
     */
  }

  return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效句柄\u客户端(int cliend\u fd)
{
int ret=accept(cliend\u fd,NULL,0);
如果(ret<0)
{
printf(“接受错误\n”);
}
其他的
{
printf(“接受的客户”);
停机(ret,2);
}
}
int main()
{
整数计数=3;
int端口=2923;
地址中的结构sockaddr_;
int主套接字[计数];
int i=0;
fd_设置读取FDS;
int-maxfd;
maxfd=-1;
国际会议;
结构timespec超时;
TimeOut.tv_sec=2;
TimeOut.tv_nsec=2;
对于(i=0;imaxfd)
{
maxfd=主插座[i];
}
printf(“%d已添加到FD_集描述符%d\n\n”,端口+i,
MasterSocket[i]);
}
//状态=0;
printf(“等待连接”);
status=pselect(maxfd+1,&readfds,NULL,NULL,&TimeOut,NULL);
如果(状态<0)
{
佩罗(“身份”);
getchar();
返回1;
}
否则如果(状态==0)
{
printf(“发生超时\n”);
}
其他的
{
//printf(“状态%d\n”,状态);
选择session=-1;
对于(i=0;i
 address.sin_port = PORT + i;
应该是

 address.sin_port = htons(PORT + i);
确保端口以网络字节顺序存储


此外,如果不再需要套接字描述符,您应该在关闭它之后
close()
socket描述符,以释放与其关联的系统资源。

这一行

 address.sin_port = PORT + i;
应该是

 address.sin_port = htons(PORT + i);
确保端口以网络字节顺序存储


此外,如果不再需要套接字描述符,您应该在关闭它之后
close()
socket描述符,以释放与其关联的系统资源。

这一行

 address.sin_port = PORT + i;
应该是

 address.sin_port = htons(PORT + i);
确保端口以网络字节顺序存储


此外,如果不再需要套接字描述符,您应该在关闭它之后
close()
socket描述符,以释放与其关联的系统资源。

这一行

 address.sin_port = PORT + i;
应该是

 address.sin_port = htons(PORT + i);
确保端口以网络字节顺序存储


此外,如果不再需要套接字描述符,在关闭它之后,您应该
close()
释放与它关联的系统资源。

从while循环中删除
getchar()

pselect
服务器等待获取字符后,它不再允许连接客户端

或者,在连接每个客户端之后,必须在服务器中输入一个字符

并使用
htons

节目:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>

void handle_client (int cliend_fd)
{
    int ret = accept(cliend_fd, NULL, 0);
    if ( ret < 0 )
        printf("Accept Error\n");
    else {
        printf ("Client Accepted\n");
        shutdown (ret, 2);
    }
    return;
}

int main()
{
    int count = 3, PORT = 8000, opt = 1, i = 0;
    int MasterSocket[count];
    int maxfd = -1, SelectSession;
    fd_set readfds;
    struct sockaddr_in address;

    struct timespec TimeOut;
    TimeOut.tv_sec = 2;
        TimeOut.tv_nsec = 2;

    for(i=0; i<count; i++)
    {
        MasterSocket[i] = socket(AF_INET , SOCK_STREAM , 0);
        printf("socket created : %d\n", MasterSocket[i]);
    }

    for(i=0; i<count; i++)
    {
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = inet_addr("192.168.1.4");
        address.sin_port = htons(PORT+i);
        if( setsockopt(MasterSocket[i], SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0 ) {    
            perror("setsockopt1");
            return -1;
        }
        if (bind(MasterSocket[i], (struct sockaddr *)&address, sizeof(address)) < 0) {
            perror ("Bind\n");
            return -1;
        }
        printf("SockerDesriptor %d---bind %d\n", MasterSocket[i], PORT+i);
    }

    for(i=0; i<count;i++)
    {
        if (listen(MasterSocket[i], 4) < 0) {
                perror ("Listen\n");
                return -1;
        }
        else
            printf("Listening on Port %d---\n", PORT+i);    
    }

    while(1)
    {   
        FD_ZERO(&readfds);
        int status;
        for (i = 0; i < count; i++)
        {
            FD_SET(MasterSocket[i], &readfds);
            if (MasterSocket[i] > maxfd)
                maxfd = MasterSocket[i];
        }

        status = pselect(maxfd + 1, &readfds, NULL, NULL, &TimeOut, NULL );
        if(status < 0)
            perror("Status");
        /* else if(status == 0)
            printf("TimeOut occured\n"); */
        else if(status > 0) {
            for (i = 0; i < count; i++)
            {
                if (FD_ISSET(MasterSocket[i], &readfds)) {
                    SelectSession = MasterSocket[i];
                    printf("SelectSession %d\n", MasterSocket[i]);
                    handle_client(SelectSession);
                    //getchar();
                }
            }
        }
    }
    return 0;
}       
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效句柄\u客户端(int cliend\u fd)
{
int ret=accept(cliend\u fd,NULL,0);
如果(ret<0)
printf(“接受错误\n”);
否则{
printf(“接受的客户”);
停机(ret,2);
}
返回;
}
int main()
{
int计数=3,端口=8000,opt=1,i=0;
int主套接字[计数];
int maxfd=-1,选择Session;
fd_设置读取FDS;
地址中的结构sockaddr_;
结构timespec超时;
TimeOut.tv_sec=2;
TimeOut.tv_nsec=2;
对于(i=0;i从while循环中删除
getchar()

pselect
服务器等待获取字符后,它不再允许连接客户端

或者,在连接每个客户端之后,必须在服务器中输入一个字符

并使用
htons

节目:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>

void handle_client (int cliend_fd)
{
    int ret = accept(cliend_fd, NULL, 0);
    if ( ret < 0 )
        printf("Accept Error\n");
    else {
        printf ("Client Accepted\n");
        shutdown (ret, 2);
    }
    return;
}

int main()
{
    int count = 3, PORT = 8000, opt = 1, i = 0;
    int MasterSocket[count];
    int maxfd = -1, SelectSession;
    fd_set readfds;
    struct sockaddr_in address;

    struct timespec TimeOut;
    TimeOut.tv_sec = 2;
        TimeOut.tv_nsec = 2;

    for(i=0; i<count; i++)
    {
        MasterSocket[i] = socket(AF_INET , SOCK_STREAM , 0);
        printf("socket created : %d\n", MasterSocket[i]);
    }

    for(i=0; i<count; i++)
    {
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = inet_addr("192.168.1.4");
        address.sin_port = htons(PORT+i);
        if( setsockopt(MasterSocket[i], SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0 ) {    
            perror("setsockopt1");
            return -1;
        }
        if (bind(MasterSocket[i], (struct sockaddr *)&address, sizeof(address)) < 0) {
            perror ("Bind\n");
            return -1;
        }
        printf("SockerDesriptor %d---bind %d\n", MasterSocket[i], PORT+i);
    }

    for(i=0; i<count;i++)
    {
        if (listen(MasterSocket[i], 4) < 0) {
                perror ("Listen\n");
                return -1;
        }
        else
            printf("Listening on Port %d---\n", PORT+i);    
    }

    while(1)
    {   
        FD_ZERO(&readfds);
        int status;
        for (i = 0; i < count; i++)
        {
            FD_SET(MasterSocket[i], &readfds);
            if (MasterSocket[i] > maxfd)
                maxfd = MasterSocket[i];
        }

        status = pselect(maxfd + 1, &readfds, NULL, NULL, &TimeOut, NULL );
        if(status < 0)
            perror("Status");
        /* else if(status == 0)
            printf("TimeOut occured\n"); */
        else if(status > 0) {
            for (i = 0; i < count; i++)
            {
                if (FD_ISSET(MasterSocket[i], &readfds)) {
                    SelectSession = MasterSocket[i];
                    printf("SelectSession %d\n", MasterSocket[i]);
                    handle_client(SelectSession);
                    //getchar();
                }
            }
        }
    }
    return 0;
}       
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效句柄\u客户端(int cliend\u fd)
{
int ret=accept(cliend\u fd,NULL,0);
如果(ret<0)
printf(“接受错误\n”);
否则{
printf(“接受的客户”);
停机(ret,2);
}
返回;
}
int main()
{
int计数=3,端口=8000,opt=1,i=0;
int主套接字[计数];
int maxfd=-1,选择Session;
fd_设置读取FDS;
地址中的结构sockaddr_;
结构timespec超时;
TimeOut.tv_sec=2;
TimeOut.tv_nsec=2;
对于(i=0;i从while循环中删除
getchar()

pselect
serv之后