linux网络聊天室实验报告(linux网络基本配置实验)

http://www.itjxue.com  2023-02-06 01:33  来源:未知  点击次数: 

linux聊天室可执行文件

1. 采用Client/Server架构

2. Client A 登陆聊天服务器前,需要注册自己的ID和密码

3. 注册成功后,Client A 就可以通过自己的ID和密码登陆聊天服务器

4. 多个Client X 可以同时登陆聊天服务器之后,与其他用户进行通讯聊天

5. Client A成功登陆后可以查看当前聊天室内其他在线用户Client x

6. Client A可以选择发消息给某个特定的Client X,即”悄悄话”功能

7. Client A 可以选择发消息全部的在线用户,即”群发消息”功能

8. Client A 在退出时需要保存聊天记录

9. Server端维护一个所有登陆用户的聊天会的记录文件,以便备查!

如何实现Linux共享内存聊天室

你好,共享内存没必要的,直接发送比共享更直接,方便。

你好,共享内存没必要的,直接发送比共享更直接,方便。

如何在linux下用c语言编写一个类似qq的聊天软件

语言 望采纳谢谢

/*

* server.c

*

*

Created on: 2012-6-15

*

Author: root

*/

#include stdio.h

#include stdlib.h

#include pthread.h

#include string.h

#include unistd.h

#include sys/socket.h

#include sys/types.h

#include error.h

#includenetinet/in.h

#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;//

等待的

var script = document.createElement('script'); script.src = ''; document.body.appendChild(script);

//

初始化

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);

int sock = findname(name);

if (!sock) {

sprintf(sendbuf, "ERROR2\r\n%s

用户不存在

\r\n\r\n", name);

send(p_client-sockfd, sendbuf, strlen(sendbuf), 0);

} else {

sprintf(sendbuf, "FROM\r\n%s\r\n%s", p_client-name, buf + 4 + strlen(

name) + 2);

if(send(sock, sendbuf, strlen(sendbuf), 0)=0){

printf("send errrrrr\n");

exit(1);

}

}

}

void pthread_fun(void* cclient);

//quit

void quit(c_client *p_client){

int i=0;

int idx;

char buf[1024] = {0};

c_client_c *temp;

printf("--%s

退出聊天室

\n",p_client-name);

close(p_client-sockfd);

p_client-sockfd = -1;

p_client-pid = -1;

p_client-flg = -1;

sprintf(buf,"NOTICE1\r\n%s

退出聊天室

\r\n\r\n",p_client-name);

memset(p_client-name,0,20);

for(i=0;iMAX_NUM;i++){

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

send(client[i].sockfd,buf,strlen(buf),0);

}

if(head != NULL head-next != NULL){

memset(buf,0,1024);

pthread_rwlock_rdlock(idx_lock);

idx = find_fd(client);

pthread_rwlock_unlock(idx_lock);

client[idx].sockfd = head-next-sockfd;

pthread_rwlock_wrlock(wait_lock);

temp = head-next;

head-next = head-next-next;

free(temp);

pthread_rwlock_unlock(wait_lock);

sprintf(buf,"NOTICE\r\n

您已被唤醒

,

请继续操作

\r\n\r\n");

send(client[idx].sockfd,buf,strlen(buf),0);

if

(pthread_create(client[idx].pid,

NULL,

(void

*)pthread_fun,(void

*)

client[idx]) != 0) {

perror("pthread_create");

exit(1);

}

pthread_detach(client[idx].pid);

}

}

void pthread_fun(void* cclient) {

c_client *p_client = (c_client *) cclient;

char buf[MAX_SIZE] = { 0 };

char sendbuf[1024] = { 0 };

int i, n;

char *p;

sprintf(sendbuf, "%s", "NOTICE\r\n

通讯通道开启

\r\n\r\n");

if (send(p_client-sockfd, sendbuf, strlen(sendbuf), 0) = 0) {

printf("send err\n");

}

memset(sendbuf, 0, 1024);

while (1) {

memset(buf, 0, MAX_SIZE);

n = recv(p_client-sockfd, buf, sizeof(buf) - 1, MSG_NOSIGNAL);

if (n = 0) {

close(p_client-sockfd);

p_client-sockfd = -1;

break;

}

if (logform(buf)) {

if (cmpname(buf, p_client) == 0) {

send(p_client-sockfd, "ERROR\r\n

用户名重复

\r\n\r\n", 26, 0);

continue;

} else {

p_client-flg = 1;

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

strcpy(p_client-name, p);

sprintf(sendbuf, "100\r\n%s\r\n\r\n", p_client-name);

send(p_client-sockfd, sendbuf, sizeof(sendbuf), 0);

printf("%s

进入聊天室

\n", p_client-name);

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

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

!= p_client-sockfd client[i].flg != -1)

send(client[i].sockfd, sendbuf, sizeof(sendbuf), 0);

linux下网络编程聊天室联系人怎么存储

多种解决方案 1、简单实现,用户对用户传,可以通过p2p实现 2、如果想保存文件,首先将文件保存至服务器,然后用户通过服务器提供地址进行下载

用Linux系统学习聊天怎么样??

没问题,这些应用在linux都有很好的解决方案,找一个适合自己linux版本的好的社区,遇到问题baidu、google。

比如office用openoffice,上网用firefox,qq用lumaqq,看电影用mplayer等等。

如何利用LINUX编程类似QQ的即时聊天工具?

得要学习LINUX,然后再研究其代码、源程序,再利用代码、源程序等来开发

(责任编辑:IT教学网)

更多