1.
客户端连接服务器(登陆,上传相应的数据(起码有聊天室编号))
2.
客户端发生消息给服务器(消息+聊天室编号)
3.
服务器根据客户端上传的聊天室编号广播消息
4.
客户端接受服务器传来的消息
用到的技术就是socket编程(应该有其他的现成的框架,不过我用得比较多的是java,不清楚c的),如果还想做个界面的话,可以用qt做,或者MFC,应该还有其他可选方式,不过我不知道~~~。
上面只是简单的,你要做完备的还有很多问题需要考虑,比如说加密数据,优化使其能容纳较多的用户,服务器崩溃时的处理方案等等。
1、首先,我们编写C语言的头文件#include <stdio.h>。
2、然后我们编写Main函数框架。
3、接下来我们定义两个变量,如下图所示。
4、然后我们编写输入的函数,如下图所示。
5、接下来在输入后,我们编写输出程序。
6、这时候,我们便可以观察最终结果。
#include<stdio.h>#include<stdlib.h>#include<string.h>
#include<sys/types.h>
#include<errno.h>
#include<netinet/in.h>
#include<sys/socket.h>
#define SERVERPORT 5555#define BACKLOG 10
#define MAXLEN 1024
int main(){
int sockfd,client_fd
int sin_size = 0
int recvlen = 0
char recvbuf[MAXLEN]={0}
struct sockaddr_in my_addr
struct sockaddr_in cli_addr
int iRet
/*建立socke通信*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("Create socket error\n\n")
exit(1)
}
printf("socket success\n")
my_addr.sin_family=AF_INET my_addr.sin_port=htons(SERVERPORT)
my_addr.sin_addr.s_addr=INADDR_ANY
memset(my_addr.sin_zero,0,8)
/*绑定socket端口*/
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1){
printf("bind error\n")
close(sockfd)
exit(1)
}
printf("bind success\n")
/*监听端口*/
if(listen(sockfd,BACKLOG) == -1){
printf("listen error\n!")
close(sockfd)
exit(1)
}
printf("listren success\n")
while(1) {
sin_size = sizeof(struct sockaddr_in)
/*阻塞等待客户端发送消息*/
if((client_fd=accept(sockfd,(struct sockaddr *)&cli_addr,&sin_size)) == -1)
{
printf("accept error !")
continue
}
printf("accept success\n")
printf("receive a connection form %s\n",inet_ntoa(cli_addr.sin_addr))
/*fork进程,子进程处理接收的信息*/
iRet=fork()
if(iRet <0)
{
printf(" fork err, pid=[%d]", getpid())
}
/*fork返回0,为子进程*/
else if(iRet == 0)
{
printf("pid=[%d]", getpid())
printf("子进程\n")
memset(recvbuf,0,sizeof(recvbuf))
/*接收客户端发送的内容*/
if((recvlen = recv(client_fd,recvbuf,MAXLEN,0)) == -1)
{
printf("recv error\n")
close(client_fd)
exit(1)
}
printf("recvlen[%d]\n",recvlen)
printf("recvmsg:\n%s\n",recvbuf)
/*向客户端发送内容*/ if(send(client_fd,recvbuf,recvlen,0) == -1)
{
printf("send error\n")
close(client_fd)
exit(1)
}
printf("sendmsg:\n%s\n",recvbuf)
close(client_fd)
exit(0)
}
/*父进程,返回子进程pid*/
else
{
printf("pid=[%d]", getpid())
printf("父进程\n")
continue
}
}
close(sockfd)
exit(0)
}