模型分析:
使用进程间通信机制的套接字方法进行通信,功能如下:
> 客户端能进行登录,且登录时,服务器向其余客户端发送该客户的登录信息。
> 客户端能发送数据到服务器,服务器向其余客户转发该数据。
> 客户端下线时,服务器能够向其余客户发送下线通知。
> 服务器能够自主地向客户端发送数据。
协议:
定义一个结构体,包括识别状态值,发送方姓名,发送内容,如下:
struct dataRecv {
char type;
char name[40];
char datachat[128];
};
客户端需要存储用户数据,定义结构体如下:
typedef struct node{
union{
int len;
struct sockaddr_in cliNode;
};
struct node *next;
}chatlinklist;
代码如下:
服务器:
chatSer.c
#include "head.h"
#define PORT 6666
#define IP "192.168.31.10"
int main(int argc, const char *argv[])
{
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sfd < 0){
ERR_MSG("socket");
return -1;
}
printf("socket create success!\n");
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
if(bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) < 0){
ERR_MSG("bind");
return -1;
}
printf("bind success!\n");
char buf[20] = "";
ssize_t res = 0;
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
//创建链表
chatlinklist *p = chatmalloc();
p->len = 0;
p->next = NULL;
struct dataRecv dataCli;
pid_t cpid = fo