聊天服务器套接字

标签 c sockets chat

我正在尝试用 C 语言创建线程聊天服务器,但无法弄清楚如何不将消息回显给用户。我希望能够连接两个或多个客户端并通过我的服务器相互聊天。

我哪里错了:

#include<stdio.h>
#include<string.h>  //strlen
#include<stdlib.h>  //strlen
#include<sys/socket.h>
#include<arpa/inet.h>   //inet_addr
#include<unistd.h>  //write
#include<pthread.h> //for threading , link with lpthread
#include<errno.h>

void *connectionHandler(void * soc_desc);

typedef struct { 
    int reader;
    int writer;
}args;

int main(int arc, char* argv[]){

    int *new_socket;
    int socFD;
    int client_sock;
    struct sockaddr_in serveraddr;
    struct sockaddr_in clientaddr;
    args t1args, t2args;
    int listenFd;
    //socklen_t clientSize= size(struct sockaddr_in);
    int c;
    int acceptFD;
    int client_sockets[2];

    socFD=socket(AF_INET, SOCK_STREAM, 0);

    puts("Socket created");

    bzero((char*) &serveraddr, sizeof(serveraddr));

    serveraddr.sin_family= AF_INET;

    serveraddr.sin_addr.s_addr=INADDR_ANY;

    serveraddr.sin_port= htons(2000);

    bind(socFD, (struct sockaddr*) &serveraddr, sizeof(serveraddr));

    puts("bind done");

    listen(socFD, 3);

    puts("Waiting for incoming connections...");
    c= sizeof(struct sockaddr_in);

    while((client_sock=accept(socFD, (struct sockaddr *)&clientaddr,(socklen_t *)&c)))
    {

        printf("%d", client_sock);
        puts("IN WHILE LOOP");

        pthread_t t1;
        new_socket= malloc(1);
        *new_socket=client_sock;

        if(pthread_create(&t1, NULL, connectionHandler, (void *)new_socket)<0){
                perror("Could not create thread");
                return -1;
        }
    }

    if(client_sock < 0)
    {
        perror("accept failed");
        return -1;
    }

        return 0;
}

void *connectionHandler(void * soc_desc)
{
    //Get the socket descriptor
//      args *temp= (args*)soc_desc; 
        int sock= *(int*)soc_desc;
        int read_size;
        char *message , client_message[2000];
        char buff[80];
/*
        while(1){
             bzero(buff,sizeof(buff));
             recv(temp->reader,buff,sizeof(buff),0);
             send(temp->writer,buff,sizeof(buff),0);

        }*/
    //Receive a message from client
        while( (read_size = recv(sock , client_message , 2000 , 0)) >0 )
        {
            //Send the message back to client
            write(sock, client_message ,strlen(client_message));
        }

        if(read_size == 0)
        {
            puts("Client disconnected");
            fflush(stdout);
        }
        else if(read_size == -1)
        {
            perror("recv failed");
        }

        //Free the socket pointer
        free(soc_desc);
        return 0;
}

最佳答案

http://beej.us/guide/bgnet/html/single/bgnet.html

我大约 3 年前用 C 进行了套接字编程,这就是我所遵循的。帮了我大忙。

关于聊天服务器套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14884450/

相关文章:

linux read() : after reading 20 bytes, 再次读取 get "Resource temporarily unavailable"

java - 客户端通过服务器与特定客户端通信

ios - xmpp框架iOS新用户注册方法

php - 基于 PHP 的站点上基于 Telegram 的聊天 : HOWTO?

networking - Haxe+实时网络

c - Linux下C程序利用inode结构修改目录为文件

c++ - 修改 saddleback 搜索以处理重复项

c - C语言中存储学生姓名和成绩的数组

javascript - socket.io 客户端 - 如果没有连接或服务器关闭,则不会触发回调

c - C语言中的字符串压缩