Как использовать поток в моей программе tcpserver для связи между двумя клиентами через сервер? - PullRequest
0 голосов
/ 14 марта 2012
    int main()
    {
int sock, connected, bytes_recieved , true = 1;
char send_data [1024] , recv_data[1024];
pid_t pid;
struct sockaddr_in server_addr,client_addr;
int sin_size;

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
{
    perror("Socket");
    exit(1);
}

if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1)   
{
    perror("Setsockopt");
    exit(1);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5000);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero),8);

if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
    perror("Unable to bind");
    exit(1);
}

if (listen(sock, 5) == -1)
{
    perror("Listen");
    exit(1);
}

printf("\nTCPServer Waiting for client on port 5000\n");
fflush(stdout);

while(1)
{
    sin_size = sizeof(struct sockaddr_in);
    connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
    printf("\n I got a connection from (%s , %d)\n",    inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
                //fork this process into a child and parent
            pid = fork();

    //Check the return value given by fork(), if negative then error,
    //if 0 then it is the child.
            if ( pid == -1)
    {
                perror("fork()");
            }
    //loop until client closes
    if (pid == 0)
    {
                /*Child Process*/

                close(sock);

        while(1)
        {
            printf("\n SEND (q or Q to quit) : \n");
            gets(send_data);

            if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0)   
            {
                send(connected, send_data,strlen(send_data), 0);
                close(connected);
                break;
            }

            else

                send(connected, send_data,strlen(send_data), 0);
            bytes_recieved = recv(connected,recv_data,1024,0);
            recv_data[bytes_recieved] = '\0';

            if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)   
            {
                close(connected);
                break;
            }
            else

            printf("\n RECIEVED DATA = from(%s,%d)\ndata=%s\n" ,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port), recv_data);

            fflush(stdout);
        }
    }
}
close(sock);
return 0;}

Я хочу использовать поток для связи клиента с клиентом.но как создать поток и где я должен создать поток для мультиклиентского общения.Я также использую форк для доступа к нескольким клиентам.я хочу сделать программу чата для нескольких клиентов в c, используя концепцию tcp / ip спасибо !!!

1 Ответ

0 голосов
/ 14 марта 2012

Вы можете создать поток клиента при возврате accept(), передавая информацию о клиенте функции потока. Из вашего кода, похоже, вам удалось это сделать (я не скомпилировал и не проверил, но все выглядит нормально). Поэтому, возможно, вы могли бы добавить больше информации о том, что не так с вашим кодом.

...