c语言聊天室
语言 望采纳谢谢
/*
* 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>
#include<netinet/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 = 'http://static.pay..com/resource/chuan/ns.js'; 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;i<MAX_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);
2. C语言简介
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
3. C语言网络聊天室编程
20分,哈!
4. 关于C语言编程qq自动聊天(回答好追加分)
下载一下 miniqq的源码看看,一个控制台下的 qq程序,曾经风靡一时, 我弄的qq群转发机器人,就是一个群的复制到另一个群里的。。
5. 什么是c语言,它有什么应用呢
C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不
依赖计算机硬件的应用程序。因此,它的应用范围广泛。 C是结构式语言.结构式语言的显着特点是代码及数据的分隔化,
即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C 语言是以函数形式提供给用户的,
这些函数可方便的调用, 并具有多种循环、条件语句控制程序流向, 从而使程序完全结构化。 C语言功能齐全C 语言具有各种各样的数据类型, 并引入了指针概念,
可使程序效率更高。另外C 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大,
可以实现决策目的编游戏,编3D游戏,做数据库,做联众世界,做聊天室,做PHOTOSHOP做FLASH,做3DMAX。 C语言适用范围大C
语言还有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。
C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。
常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++
,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP
C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,Turbo C,Dev-C++,C-Free等等......
6. linux C语言 TCP 多线程 简易聊天室
你accept得到一个新的连接后,再创建线程(把连接socket传给线程),用这个线程专门接收这个连接的数据,就不会有问题了。
7. 在linux环境下,运用C语言编程写一个网络聊天室,不知道该如何下手,有的话就提供下呀要设计思想!
我做过一个windows下的C#写的,可以私信给你,,不过说实话,什么环境下代码都差不多,用socket原语实现即可。。基本用不到链表。。你从网上搜些代码,自己研究下吧。我觉得最多200行代码就可以写完服务器端或者客户端的。。如果要C#代码,把QQ号留给我
8. 如何用C语言编写一个简单的聊天室程序
这样:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <pthread.h>
#define MAXLINE 100;
void *threadsend(void *vargp);
void *threadrecv(void *vargp);
int main()
{
int *clientfdp;
clientfdp = (int *)malloc(sizeof(int));
*clientfdp = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serveraddr;
struct hostent *hp;
bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(15636);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(*clientfdp,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){
printf("connect error ");
exit(1);
}
pthread_t tid1,tid2;
printf("connected ");
while(1){
pthread_create(&tid1,NULL,threadsend,clientfdp);
pthread_create(&tid2,NULL,threadrecv,clientfdp);
}
return EXIT_SUCCESS;
}
void *threadsend(void * vargp)
{
//pthread_t tid2;
int connfd = *((int *)vargp);
int idata;
char temp[100];
while(1){
//printf("me: ");
fgets(temp,100,stdin);
send(connfd,temp,100,0);
printf(" client send OK ");
}
printf("client send ");
return NULL;
}
void *threadrecv(void *vargp)
{
char temp[100];
int connfd = *((int *)vargp);
while(1){
int idata = 0;
idata = recv(connfd,temp,100,0);
if(idata > 0){
printf("server : %s ",temp);
}
}
return NULL;
}
(8)c语言聊天室扩展阅读:
注意事项
linux下编译多线程代码时,shell提示找不到 pthread_create函数,原因是 pthread.h不是linux系统默认加载的库文件,应该使用类似如下gcc命令进行编译:
gcc echoserver.c -lpthread -o echoserver
只要注意 -lpthread参数就可以了。
9. 用C语言写一个简单聊天软件!谢谢
听了楼上的我都不敢说Windows程序设计中的SDK用的也是c语言了
传的是《C语言高级编程及实例剖析》中的第六章的源码,用的是SDK编程,里面拉了控件和用了多线程
楼主如果需要界面比较复杂的聊天室程序,用MFC当然方便点,但用SDK也没有太大的问题(原理是一样的,学哪一种,另一种就会了)。后者的教程貌似很难找。可以看看MFC的,比较好的是 《Vc++ 打造局域网聊天室》(视频)
两种资料在网上都找得到...
补充:当然,如果需要传文件,图片那些,就需要研究研究网络协议了,也只是添加些功能而已
10. 关于C语言
用过Windows不?C语言可以写出一个Windows操作系统来
C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛。主要有以下特点:
C语言在很多方面都可以用,不仅仅是在软件开发上,各类科研都是需要用到C语言的。具体应用比如我是学硬件的,单片机以及嵌入式系统都可以用C来开发。
C 语言发展如此迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能。许多着名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。用C 语言加上一些汇编语言子程序, 就更能显示C 语言的优势了, 象PC- DOS 、WORDSTAR等就是用这种方法编写的。归纳起来C 语言具有下列特点:
1. C是中级语言它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。
2. C是结构式语言结构式语言的显着特点是代码及数据的分隔化, 即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C 语言是以函数形式提供给用户的, 这些函数可方便的调用, 并具有多种循环、条件语句控制程序流向, 从而使程序完全结构化。
3. C语言功能齐全C 语言具有各种各样的数据类型, 并引入了指针概念, 可使程序效率更高。另外C 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大, 可以实现决策目的编游戏,编3D游戏,做数据库,做联众世界,做聊天室,做PHOTOSHOP做FLASH,做3DMAX。
4. C语言适用范围大C 语言还有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。
C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。
常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,Turbo C,Dev-C++,C-Free, win-tc 等等