C套接字编程中的多个客户端

时间:2014-12-27 15:15:06

标签: c sockets networking client server

我正在创建一个简单的echo服务器,它监听SOCK_STREAM并继续接受无限连接。 在函数int listen(int sockfd,int backlog)中。我已将backlog设置为1,这是否意味着最多只有1个客户端可以在队列中等待?

考虑我遇到的以下情况。

服务器已启动并接受来自客户端1的连接

现在客户端2尝试连接并连接

现在客户端3尝试连接并连接

现在客户端2发送“hello2”并等待回复

现在客户端3发送“hello3”并等待回复

现在客户端1发送“hello1”并从服务器

获得回复“hello1”

现在,客户端2从服务器

获得回复“hello2”

然后客户端3从服务器

获得回复“hello3”

这怎么可能?客户端2和客户端3连接时是否应该出错,因为服务器已连接到客户端1且最大队列大小为1?

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

#define max_request 4
char buffer[50];

void clear()
{
int i;
for(i=0;i<50;i++)
buffer[i]=NULL;
}

int main()
{
    int status;

    struct sockaddr_in addrport;
    addrport.sin_family = AF_INET;
    addrport.sin_port = htons(5100);
    addrport.sin_addr.s_addr = htonl(INADDR_ANY);

        int sockid = socket(PF_INET, SOCK_STREAM, 0);

    if(bind(sockid, (struct sockaddr *) &addrport, sizeof(addrport))== -1) 
    {
        printf("\nBinding Failed\n");
        return(0);
    }


    int listen_status=listen(sockid,1);
    if(listen_status==-1)
    printf("\nListening Error\n");
    else    
    printf("\nWaiting for connections...\n");


    while(1)
    {
        struct sockaddr_in clientaddr;
        int addlen=sizeof(struct sockaddr_in);

        int new_client_socket=accept(sockid,(struct sockaddr *)&clientaddr,&addlen);

        char *client_ip;
        client_ip=inet_ntoa(clientaddr.sin_addr);
        printf("\n Connection from %s \n",client_ip);


        status=recv(new_client_socket,buffer,50,0);
        if(status!=-1)
        status=send(new_client_socket,buffer,50,0);     
        clear(); // clears the variable buffer

    }



    close(sockid);
}

客户:

int main()
{
    int s,k;char buff[50],c[50];

    struct sockaddr_in serverport;

    serverport.sin_family = AF_INET;
    serverport.sin_port = htons(5100);
    serverport.sin_addr.s_addr = inet_addr("0.0.0.0");

    int sockid=socket(PF_INET,SOCK_STREAM,0);   

    int connect_status=connect(sockid,(struct sockaddr *) &serverport,sizeof(serverport));
    if(connect_status<0)
    {
        printf("\nConnection Error\n");
        return(1);
    }
    printf("\nConnected\n");

    gets(buff); // message to be sent to server

     s=send(sockid,buff,50,0);
        k=recv(sockid,c,50,0);

    printf("\nServer : %s \n ",c);
    close(sockid);
}

1 个答案:

答案 0 :(得分:1)

  

客户端2和客户端3在连接时不会出错   服务器已连接到客户端1,最大队列大小为1?

不,没有错误。

&#39;最大队列大小为1&#39; - 如果接受成功,则队列为空,另一个客户端可以连接。