聊天服务器套接字

聊天服务器套接字

问题描述:

我想在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; 
} 
+0

1)不要假设nul结尾的缓冲区。 2)不使用strlen()3)使用read()和write()的返回值。 4)就是这样。 – wildplasser 2013-02-14 21:37:50

+0

据我所知,在行'写(袜子,client_message,strlen(client_message));'你想从其他线程[s]得到消息? – 2013-02-14 21:45:33

+0

不,我有多个人连接到此服务器,我想将消息传递给每个客户端,但不是发送客户端。我被困在搞清楚如何做到这一点。我认为我可以用pthreads做到这一点,但我不知道如何做到这一点。 – jg943 2013-02-14 22:17:31

http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html

我做socket编程生根粉3岁前有C,这是我紧随其后。帮了我很多。