//-------------client.c------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#define TRUE 1
#define PORT 6555
static int sockfd;
void recvfromserver() //接受服务器消息线程入口函数
{
char mes[1024];
int nbytes=0;
while(1)
{
memset(mes,0,sizeof(mes));
nbytes=read(sockfd,mes,sizeof(mes));
if(nbytes>0)
{
mes[nbytes]='\0';
printf("%s\n",mes);
}
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
// int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;
char strhost[16];
char clientname[20];
char mes[1024];
int thr_id; /* thread ID for the newly created thread */
pthread_t p_thread; /* thread's structure */
if(argc!=1)
{
fprintf(stderr,"Usage:%s \a\n",argv[0]);
exit(1);
}
printf("请输入服务器ip地址\n");
//scanf("%s",strhost);
if((host=gethostbyname("127.0.0.1"))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}
/* 客户程序开始建立 sockfd 描述符 */
printf("正在建立套接口...\n");
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);
printf("套接口创建成功,正在链接服务器...\n");
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
/* 连接成功了 */
printf("链接服务器成功\n欢迎来到聊天室\n");
printf("请输入你的用户昵称\n");
scanf("%s",clientname);
// write(sockfd,clientname,sizeof(clientname));
printf("\n\n开始聊天吧(\"Quit\"断开连接)\n\n");
thr_id = pthread_create(&p_thread, NULL, recvfromserver, NULL);
while(1)
{
memset(buffer,0,sizeof(buffer));
memset(mes,0,sizeof(mes));
gets(buffer);
strcat(mes,clientname);
strcat(mes,":");
strcat(mes,buffer);
// printf("main thread %s\n",mes);
if((write(sockfd,mes,sizeof(mes)))==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
if(strcmp(buffer,"Quit")==0)
{
break;
}
}
/* 结束通讯 */
close(sockfd);
exit(0);
}
//-----------------server.c--------------
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXLINE 1000 //在一条消息中最大的输出字符数
#define LISTENQ 20 //最大监听队列
#define PORT 6555 //监听端口
#define MAXFD 20 //最大的在线用户数量
void *get_client(void *);
int sockfd,i;
static int maxi=0;//maxi表示当前client数组中最大的用户的i值
static int client[MAXFD];
void recvandsend(void * arg) //监听转发线程入口函数
{
printf("hello new thread\n");
int index=(int)arg;
int nbytes=0;
char buffer[1024];
int len;
int outindex=0;
printf("Listen Client[%d]", index);
while(1)
{
memset(buffer,0,sizeof(buffer));
nbytes=0;
//index++;
nbytes=read(client[index],buffer,sizeof(buffer));
// printf("%d,%d\n",index,client[index]);
if(nbytes>0)
{
buffer[nbytes]='\0';
printf(" %s\n",buffer);
outindex=0;
while(outindex<maxi)
if(write(client[outindex++],buffer,sizeof(buffer))==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
}
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
// int client_fd[LISTENQ],clientnum=0;;
printf("server port has been open\a\n");
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
char hello[]="Hello! Are You Fine?\n";
int thr_id[10]; /* thread ID for the newly created thread */
pthread_t p_thread[10]; /* thread's structure */
int new_fd=0;
memset(client,0,sizeof(client));
if(argc!=1)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}
/* 服务器端开始建立 socket 描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}
/* 服务器端填充 sockaddr 结构 */
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(PORT);
/* 捆绑 sockfd 描述符 */
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
printf("The server port has been opened%d...\n",PORT);
/* 监听 sockfd 描述符 */
if(listen(sockfd,LISTENQ)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}
printf("Welcome to this chatroom\n");
while(1)
{
/* 服务器阻塞,直到客户程序建立连接 */
if(maxi>=20)
{
printf("The number of the people was too much,Please wait while !以达到人数上线\a\n");
continue;
}
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
/*fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));*/
client[maxi]=new_fd;
thr_id[maxi] = pthread_create(&p_thread[maxi], NULL, recvandsend, maxi);
maxi++;
printf("\n新用户进入聊天室%d\n",new_fd);
}
close(sockfd);
exit(0);
}
if you want running the coding,please according to the next guide:
->gcc -o server ../server.c -lpthread
->./server
->ggc -o client ../client.c -lpthread
->./client
本文介绍了一个简易聊天室的实现过程,包括客户端和服务端的代码细节。客户端负责输入和显示消息,而服务端则负责接收消息并广播给所有连接的客户端。
727

被折叠的 条评论
为什么被折叠?



