c - 如何使用 tcpserver 程序中的线程通过服务器在两个客户端之间进行通信?

标签 c multithreading sockets tcp

    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;}

我想使用线程进行客户端到客户端的通信。 但是如何创建线程以及我必须在哪里创建线程以进行多客户端通信。 我还使用 fork 来访问多个客户端。 我想使用 TCP/IP 概念在 C 中制作多客户端聊天程序 谢谢!!!

最佳答案

您可以在 accept() 返回时创建客户端线程,将客户端信息传递给线程函数。从您的代码来看,您似乎已经成功做到了(我还没有真正编译和检查,但看起来不错)。因此,也许您可​​以添加更多有关代码问题的信息。

关于c - 如何使用 tcpserver 程序中的线程通过服务器在两个客户端之间进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9698775/

相关文章:

C 将链表写入文件

android - 如何使 native C 可执行文件在 Android 中永远运行?

c++ - 处理一个套接字和多个线程时异步 IO 的用例

Java,线程示例,使其同步更好

java - 有没有办法在 Java 中访问 SOL_TCP(又名 IPPROTO_TCP)套接字选项(例如 TCP_KEEPIDLE)?

c++ - 为什么 C 编译器不能以直观的方式进行有符号/无符号比较

c - C 中未声明的宏

java - Java 监视器的等待集是否优先于入口集?

javascript - socket.io-redis 在 redis 3.0.6 中出现尾随字节错误

Java 网络 - 在同一线程中的不同端口上并行启动多个服务器套接字