聊天服务器套接字
问题描述:
我想在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;
}
1)不要假设nul结尾的缓冲区。 2)不使用strlen()3)使用read()和write()的返回值。 4)就是这样。 – wildplasser 2013-02-14 21:37:50
据我所知,在行'写(袜子,client_message,strlen(client_message));'你想从其他线程[s]得到消息? – 2013-02-14 21:45:33
不,我有多个人连接到此服务器,我想将消息传递给每个客户端,但不是发送客户端。我被困在搞清楚如何做到这一点。我认为我可以用pthreads做到这一点,但我不知道如何做到这一点。 – jg943 2013-02-14 22:17:31