多人聊天室算是socket网络编程中比较基础的一个功能了,它主要由服务器和客户端两部分组成。其中客户端比较容易实现,只需要完成发送和接收消息的功能,而服务器则需要对每个客户端发送的数据进行分析,判断出消息的类型,从而决定是保存,删除还是转发。下面进行具体的说明:(基于TCP协议)
客户端:
预编译和全局变量的声明:
#include <stdio.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#define MAX_name 50
#define MAX_mess 1024
int fd;
char recvs[MAX_mess];
创建和连接套接口:
char pre_name[55]={"NAME_C*"}; //姓名前缀,标识用户信息
if(argc<=2)
{
printf("%s ip_address port_number!!\n",argv[0]);
exit(1);
}
int port=atoi(argv[2]);
const char *ip=argv[1];
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1) //创建套接口描述字
{
printf("socket() error!!\n");
exit(1);
}
memset(&server,0,sizeof(struct sockaddr)); //填充server信息
server.sin_family=AF_INET;
server.sin_port=htons(port);
inet_pton(AF_INET,ip,&server.sin_addr);
if(connect(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1)
{
printf("connect error!!\n");
exit(1);
}
printf("please input your name:");
fgets(name,sizeof(name),stdin);
strcat(pre_name,name);
send(fd,pre_name,strlen(pre_name),0);
这一部分算是连接前的准备部分了,首先在打开客户端时应该指定服务器的ip地址与端口号,并将其存入struct sockaddr_in结构体中,接着申请一个socket,将之与服务器相连(客户端的socket会自动bind()),连接成功后输入一个用户名作为在聊天室中的一个标识,而NAME_C*前缀则是为了方便服务器区分消息的类型。
发送消息:
while(1)
{
char pre_mess[1030]={"MESS_C*"}; //消息内容前缀
memset(sends,'\0',sizeof(sends));
fgets(sends,sizeof(sends),stdin);
if(!strcmp(sends,"exit!\n"))
{
send(fd,sends,strlen(sends),0);
printf("you choose to exit!!\n");
close(fd);
e