在 c 中使用 TCP 的多用户聊天服务器。如何向多个客户端发送数据?

阿达什·D

我想在 C 中使用 TCP 创建一个多用户聊天服务器,其中,当客户端向服务器发送消息时。它将发送给所有其他客户端。

我找不到任何将数据发送到多个客户端的方法,是否有某种方法可以遍历连接到套接字的所有客户端,或者是否有某种方法可以向所有客户端广播消息。

这是我的代码

服务器.c

#include <stdio.h>
#include <sys/socket.h> //for sock()
#include <string.h>//for using memset
#include <arpa/inet.h>// for inet_addr()
#include <unistd.h>//for using write() function


int main(){


int sock=0, client_conn=0,counter=0,pid;
char data_send[1024],data_received[1024];
struct sockaddr_in ServerIp;
sock = socket(AF_INET, SOCK_STREAM, 0);


 memset(&ServerIp,'0',sizeof(ServerIp) );
 ServerIp.sin_family = AF_INET;
 ServerIp.sin_port = htons(1234);
 ServerIp.sin_addr . s_addr = inet_addr("127.0.0.1");


 if(   bind( sock,(struct sockaddr* )&ServerIp, sizeof(ServerIp)) == -1 )
    printf("\n Socket binding failed ");

if( listen(sock,20) == -1) 
    printf("Error\n");
else    
    printf("\n Server started\n");

for(;;){
    label:

    client_conn = accept( sock, (struct sockaddr*)NULL, NULL);
    pid = fork();
    if( pid < 0 )
        printf("\n Process creation failed ");
    else if( pid > 0 ){
        counter++;
        ///close(client_conn); 
        goto label;
    }   
    else{
        counter++;
        if( recv(client_conn, data_received, 1024, 0 ) == -1 )
            printf(" Error !! cannot get response \n");

        printf(" data from client is %s\n",data_received);
        sprintf(data_send," Hi client %d !! from server ",counter);
        write( client_conn, data_send, sizeof(data_send) );

    }

}   


close( sock );

return 0;
}

客户端

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h> //for sock()
#include <string.h>//for using memset
#include <arpa/inet.h>// for inet_addr()
#include <unistd.h>//for using write() function

int main(){
enter code here
    char data_received[1024],data_send[1024];
int sock=0;
struct sockaddr_in ServerIp;


if( (sock = socket(AF_INET, SOCK_STREAM ,0 )) == -1 )
    printf(" socket creation failed ");


 ServerIp.sin_family = AF_INET;
 ServerIp.sin_port = htons(1234);
 ServerIp.sin_addr . s_addr = inet_addr("127.0.0.1");   


 if( (connect( sock, (struct sockaddr *)&ServerIp, sizeof(ServerIp) )) == -1 ){
    printf("\n connection to the socket failed ");
    exit(0);
}
 else
    printf("\n connected to socket \n");

strcpy(data_send,"hello server");
if( send(sock,data_send,sizeof(data_send),0) == -1 )
    printf("sending failed ");


while(1){
 printf("\n waiting for respose !! \n");    


 if( recv(sock, data_received, 1024, 0 ) == -1 )
    printf(" Error !! cannot get response |n");
 else
    printf("\n Response Received is : %s", data_received );
    }

}

有什么建议么??

阿达什·D

我找到了一种使用 pthread 的简单易行的方法。这是代码

服务器代码

#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>

pthread_mutex_t mutex;
int clients[20];
int n=0;

void sendtoall(char *msg,int curr){
    int i;
    pthread_mutex_lock(&mutex);
    for(i = 0; i < n; i++) {
        if(clients[i] != curr) {
            if(send(clients[i],msg,strlen(msg),0) < 0) {
                printf("sending failure \n");
                continue;
            }
        }
    }
    pthread_mutex_unlock(&mutex);
}

void *recvmg(void *client_sock){
    int sock = *((int *)client_sock);
    char msg[500];
    int len;
    while((len = recv(sock,msg,500,0)) > 0) {
        msg[len] = '\0';
        sendtoall(msg,sock);
    }

}

int main(){
    struct sockaddr_in ServerIp;
    pthread_t recvt;
    int sock=0 , Client_sock=0;

    ServerIp.sin_family = AF_INET;
    ServerIp.sin_port = htons(1234);
    ServerIp.sin_addr.s_addr = inet_addr("127.0.0.1");
    sock = socket( AF_INET , SOCK_STREAM, 0 );
    if( bind( sock, (struct sockaddr *)&ServerIp, sizeof(ServerIp)) == -1 )
        printf("cannot bind, error!! \n");
    else
        printf("Server Started\n");

    if( listen( sock ,20 ) == -1 )
        printf("listening failed \n");

    while(1){
        if( (Client_sock = accept(sock, (struct sockaddr *)NULL,NULL)) < 0 )
            printf("accept failed  \n");
        pthread_mutex_lock(&mutex);
        clients[n]= Client_sock;
        n++;
        // creating a thread for each client 
        pthread_create(&recvt,NULL,(void *)recvmg,&Client_sock);
        pthread_mutex_unlock(&mutex);
    }
    return 0; 

}

客户代码

#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>

char msg[500];

void *recvmg(void *my_sock)
{
    int sock = *((int *)my_sock);
    int len;
    // client thread always ready to receive message
    while((len = recv(sock,msg,500,0)) > 0) {
        msg[len] = '\0';
        fputs(msg,stdout);
    }
}

int main(int argc,char *argv[]){
    pthread_t recvt;
    int len;
    int sock;
    char send_msg[500];
    struct sockaddr_in ServerIp;
    char client_name[100];
    strcpy(client_name, argv[1]);
    sock = socket( AF_INET, SOCK_STREAM,0);
    ServerIp.sin_port = htons(1234);
    ServerIp.sin_family= AF_INET;
    ServerIp.sin_addr.s_addr = inet_addr("127.0.0.1");
    if( (connect( sock ,(struct sockaddr *)&ServerIp,sizeof(ServerIp))) == -1 )
        printf("\n connection to socket failed \n");

    //creating a client thread which is always waiting for a message
    pthread_create(&recvt,NULL,(void *)recvmg,&sock);

    //ready to read a message from console
    while(fgets(msg,500,stdin) > 0) {
        strcpy(send_msg,client_name);
        strcat(send_msg,":");
        strcat(send_msg,msg);
        len = write(sock,send_msg,strlen(send_msg));
        if(len < 0) 
            printf("\n message not sent \n");
    }

    //thread is closed
    pthread_join(recvt,NULL);
    close(sock);
    return 0;
}

要查看输出,请参阅https://codingile.wordpress.com/multiuser-chat-server-in-c/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++服务器使用TCP向Android客户端发送消息

来自分类Dev

使用TCP c#将数据包从服务器发送到特定客户端

来自分类Dev

在C ++中使用TCP套接字进行远程客户端和服务器通信

来自分类Dev

TCP 套接字客户端和服务器在一个程序中使用 c Linux

来自分类Dev

PHP-C#TCP客户端/服务器如何发送字符串?

来自分类Dev

使用C#的TCP / IP服务器/客户端多连接并接收客户端的公共IP地址

来自分类Dev

在ASP.NET中使用C#从客户端向服务器端发送值

来自分类Dev

如何在Java中使用TCP / IP将相同的数据从服务器发送到所有客户端?

来自分类Dev

从客户端向服务器发送字符串,然后保存文件(使用C)

来自分类Dev

c#从服务器ping TCP客户端

来自分类Dev

c#从服务器ping TCP客户端

来自分类Dev

C# TCP 客户端发送消息,但服务器未收到消息

来自分类Dev

如何使用民意调查来接受多个客户?(TCP服务器)(C)

来自分类Dev

在C中使用HTTP / 1.0服务器,如何将大文件发送到客户端?

来自分类Dev

单个TCP / IP服务器可以处理多个客户端(在C ++中)?

来自分类Dev

从客户端C#连接到多个TCP服务器

来自分类Dev

使用g ++的TCP服务器客户端

来自分类Dev

TCP套接字,发送文件,客户端服务器,服务器不保存整个文件,C语言

来自分类Dev

使用 asyncio 和 Python 3.6,如何构建处理/提交多个顺序请求的 TCP 服务器/客户端?

来自分类Dev

如何使用C ++中的Websocket客户端将消息发送到服务器?

来自分类Dev

如何在TCP Python聊天服务器上有多个客户端?

来自分类Dev

Windows上的tcp服务器c#,tcp客户端python raspberry pi

来自分类Dev

Windows上的TCP服务器C#,TCP客户端python raspberry pi

来自分类Dev

客户端向tcp服务器发送数据,tcp服务器向另一台服务器发送数据

来自分类Dev

Java(客户端)和C#(服务器)TCP套接字。和服务器从客户端读取无限的最后数据

来自分类Dev

使用c的TCP / IP服务器

来自分类Dev

Spring Integration和TCP服务器套接字-如何向客户端发送消息?

来自分类Dev

如何从服务器向客户端发送消息(TCP,Android应用程序)

来自分类Dev

如何让 TCP 服务器处理多个客户端?

Related 相关文章

  1. 1

    C ++服务器使用TCP向Android客户端发送消息

  2. 2

    使用TCP c#将数据包从服务器发送到特定客户端

  3. 3

    在C ++中使用TCP套接字进行远程客户端和服务器通信

  4. 4

    TCP 套接字客户端和服务器在一个程序中使用 c Linux

  5. 5

    PHP-C#TCP客户端/服务器如何发送字符串?

  6. 6

    使用C#的TCP / IP服务器/客户端多连接并接收客户端的公共IP地址

  7. 7

    在ASP.NET中使用C#从客户端向服务器端发送值

  8. 8

    如何在Java中使用TCP / IP将相同的数据从服务器发送到所有客户端?

  9. 9

    从客户端向服务器发送字符串,然后保存文件(使用C)

  10. 10

    c#从服务器ping TCP客户端

  11. 11

    c#从服务器ping TCP客户端

  12. 12

    C# TCP 客户端发送消息,但服务器未收到消息

  13. 13

    如何使用民意调查来接受多个客户?(TCP服务器)(C)

  14. 14

    在C中使用HTTP / 1.0服务器,如何将大文件发送到客户端?

  15. 15

    单个TCP / IP服务器可以处理多个客户端(在C ++中)?

  16. 16

    从客户端C#连接到多个TCP服务器

  17. 17

    使用g ++的TCP服务器客户端

  18. 18

    TCP套接字,发送文件,客户端服务器,服务器不保存整个文件,C语言

  19. 19

    使用 asyncio 和 Python 3.6,如何构建处理/提交多个顺序请求的 TCP 服务器/客户端?

  20. 20

    如何使用C ++中的Websocket客户端将消息发送到服务器?

  21. 21

    如何在TCP Python聊天服务器上有多个客户端?

  22. 22

    Windows上的tcp服务器c#,tcp客户端python raspberry pi

  23. 23

    Windows上的TCP服务器C#,TCP客户端python raspberry pi

  24. 24

    客户端向tcp服务器发送数据,tcp服务器向另一台服务器发送数据

  25. 25

    Java(客户端)和C#(服务器)TCP套接字。和服务器从客户端读取无限的最后数据

  26. 26

    使用c的TCP / IP服务器

  27. 27

    Spring Integration和TCP服务器套接字-如何向客户端发送消息?

  28. 28

    如何从服务器向客户端发送消息(TCP,Android应用程序)

  29. 29

    如何让 TCP 服务器处理多个客户端?

热门标签

归档