linux 下用c语言编写的聊天室程序,服务器和客户端

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*

* server.c

*

* Created on: 2012-6-15

* Author: root

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define PORT 7999

#define MAX_NUM 3 //client连接最大个数

#define MAX_CLIENT 15

#define MAX_SIZE 1024

pthread_rwlock_t idx_lock, wait_lock;

//client 信息

typedef struct _client {

int sockfd;

char name[20];

pthread_t pid;

int flg;

} c_client;

c_client client[MAX_CLIENT];//定义client;

//等待的client

struct _client_ {

int sockfd;

char name[20];

pthread_t pid;

struct _client_ *next;

};

typedef struct _client_ c_client_c;

c_client_c *head = NULL;

c_client_c *temp_c1 = NULL, *temp_c2 = NULL;//等待的

//初始化client信息

void init_client() {

int i = 0;

for (i = 0; i < MAX_CLIENT; i++) {

client[i].sockfd = -1;

memset(client[i].name, 0, 20);

client[i].pid = -1;

client[i].flg = -1;

}

}

//查找结构体数组中sockfd为-1的下标值

int find_fd(c_client *client) {

int i = 0;

while (i < MAX_NUM) {

// printf("====%d\n",client[i].sockfd);

if (client[i].sockfd == -1)

return i;

i++;

}

return -1;

}

//判断登录格式

int logform(char *buf) {

char *p = strstr(buf, "LOGIN\r\n");

int n = strlen(buf);

char *q = p + n - 4;

if (p != NULL && p + 7 != q && strcmp(q, "\r\n\r\n") == 0)

return 1;

else

return 0;

}

int cmpname(char *buf, c_client *p_client) {

int i = 0;

char *p = strtok(buf + 7, "\r\n\r\n");

while (client[i].sockfd != -1 && client[i].sockfd != p_client->sockfd && i < MAX_NUM) {

if (strcmp(client[i].name, p) == 0)

return 0;

i++;

}

return 1;

}

//SHOW

void showuser(c_client *p_client) {

int i = 0;

char buf[1024] = { 0 };

strcpy(buf, "200\r\n");

for (i = 0; i < MAX_NUM; i++) {

if (client[i].sockfd != -1) {

sprintf(buf + strlen(buf), "%s\r\n", client[i].name);

}

}

sprintf(buf + strlen(buf), "\r\n");

send(p_client->sockfd, buf, strlen(buf), 0);

}

//ALL

void sendto_all(c_client *p_client, char *buf) {

int i = 0;

char sendbuf[1024] = { 0 };

sprintf(sendbuf, "AFROM\r\n%s\r\n%s", p_client->name, buf + 5);

for (i = 0; i < MAX_NUM; i++) {

if (client[i].sockfd != -1 && client[i].flg != -1)

if(send(client[i].sockfd, sendbuf, strlen(sendbuf), 0) <= 0){

printf("send errrrrr\n");

exit(1);

}

}

}

int findname(char *name) {

int i = 0;

for (i = 0; i < MAX_NUM; i++) {

if (client[i].sockfd != -1 && strcmp(client[i].name, name) == 0) return client[i].sockfd;

}

return 0;

}

//TO

void sendto_one(c_client *p_client, char *buf) {

int i = 0;

char sendbuf[1024] = { 0 };

char name[20] = { 0 };

char *p = strtok(buf + 4, "\r\n");//TO\r\n:4个字符后取出\r\n前的名字strcpy(name, p);

相关文档
最新文档