进来帮帮忙....帮我改程序OK?..关于聊天室功能.里面有源代码.....

sen6888 2004-03-16 02:46:09
大家能帮帮我调试并实现这个功能这个聊天室的功能吗????我是刚开始学的,在redhat 9.0 下调试没有错误,但却总是实现不了聊天室的功能呀.......教教我,好吗?大家帮我修改一下,调试好能运行了...把修改后的源程序发给我,行吗??谢谢了.

Email: sen6888@163.com
QQ : 49213575


原理:

客户端程序首先与服务端建立连接,然后交本端的 id 发送到服务端..服务端收到这个消息,就会发送广播,让其它所有已经在聊天中的客户端知道有新的客户加入聊天.退出聊天时客户端不主动关闭连接,而是请求服务端关闭连接.收到服务端发送的FIN信号后(即read()返回0),客户端才关闭所有句柄退出.需要说明的一点,是发送的数据的格式.客户端向服务端发送的每一条信息,其第一个字节代表的是该信息的类型....第一个字节为 1 的信息表示是客户端发送的第一条信息,其后面紧接着客户端的 id .第一个字节为 2 的信息表示客户端断开连接的请求,其后为空.第一个字节为 3 的信息是客户端发送的聊天信息...服务端收到聊天信息后将其发送到所有聊天中的客户端.......




代码:
/*chatcli.c--A TCP Chat Client 客户端程序. */


#include <sys/types.h>
#include <arpa/inet.h>
#include <stdio.h>
#define BUFLEN 255
#define max(x,y)(((x)>(y))?(x):(y))

int main(int argc,char ** argv)
{
struct sockaddr_in servaddr;
int sockfd,n;
char inmsg[BUFLEN+1],outmsg[BUFLEN+1];
fd_set infds;
int maxfd;
if(argc!=4) {
printf("%s<IP address><port><id>\n",argv[0]);
/*id 是该客户在聊天中的代号 */
exit(0);
}
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0) {
fprintf(stderr,"socket creating error in chatcli.c\n");
exit(1);
}
memset(&servaddr,0,sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2]));
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0) {
printf("Wrong IP address\n");
exit(0);
}
if(connect(sockfd,(struct sockaddr *)(&servaddr),sizeof(struct sockaddr_in))<0){
printf("Connection Chat Server Failure\n");
exit(0);
}
outmsg[0] = 1;
outmsg[1] = 0;
strcpy(outmsg + 1,argv[3]);
write(sockfd,outmsg,strlen(outmsg));
for(;;){
/*loop her ,exit when necessary */
FD_ZERO(&infds);
FD_SET(fileno(stdin),&infds);
FD_SET(sockfd,&infds);
maxfd = max( fileno(stdin),sockfd );
select(maxfd+1,&infds,NULL,NULL,NULL);
if(FD_ISSET(sockfd,&infds)){
/* 处理 socket 输入 */
n = read(sockfd,inmsg,BUFLEN);
if(n==0) {
printf("connection closed\n");
exit(0);
}
if(n==-1) {
printf("Chat Server crashed\n");
/* 接收到RST 或是其它错误*/
exit(3);
}
inmsg[n]=0;
printf("%s",inmsg);
}
if(FD_ISSET(fileno(stdin),&infds)){
/*处理stdin输入*/
if(fgets(inmsg,BUFLEN,stdin) == NULL) {
printf("Closing chat...\n");
outmsg[0] = 2;
outmsg[1] = 0;
/*发送到服务端的最后一条信息*/
}
else {
outmsg[0] = 3;
outmsg[1] = 0;
strcat(outmsg,argv[3]);
strcat(outmsg,":");
/*outmsg head with "<id>:" */
strcat(outmsg,inmsg);
}
write(sockfd,outmsg,strlen(outmsg));
}
} /*for end */
} /*main end */



/* chatserv.c--A TCP Chat Server 服务端 */

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#define BUFLEN 255
#define MAXCLI 50
#define IDLEN 10
#define max(x,y) ( ((x)>(y))?(x):(y) )

int main(int argc,char ** argv)
{
struct sockaddr_in servaddr,cliaddr;
int listenfd,clifd[MAXCLI];
char msg[BUFLEN+1],broadmsg[BUFLEN+1],cliid[MAXCLI][IDLEN+1];
fd_set infds;
int maxfd,socklen,slen;
int i,n;
if(argc!=2) {
printf("%s<port>\n",argv[0]);
exit(0);
}
listenfd = socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0){
fprintf(stderr,"socket creating error in chatserv.c\n");
exit(1);
}
memset(&servaddr,0,sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[1]));
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in)) < 0 ) {
fprintf(stderr,"bind error in chatserv.c\n");
exit(1);
}
listen(listenfd,5);
for(i=0;i<MAXCLI;i++)
clifd[i] = 0;
for(;;) {
FD_ZERO(&infds);
FD_SET(listenfd,&infds);
maxfd = listenfd;
for(i=0;i<MAXCLI;i++){
if(clifd[i]!=0) {
FD_SET(clifd[i],&infds);
if(maxfd<clifd[i]) maxfd = clifd[i];
}
}
select(maxfd+1,&infds,NULL,NULL,NULL);
if ( FD_ISSET(listenfd,&infds)) {
/*proceed with listenfd */
socklen = sizeof(struct sockaddr);
for(i=0;i<MAXCLI;i++)
if (clifd[i]==0) {
/*查找一个空的句柄*/
clifd[i] = accept(listenfd,(struct sockaddr *)(NULL),&socklen);
break; /*找到空句柄就跳出循环*/
}
}
} /*listenfd select */
for(i=0;i<MAXCLI;i++) {
if(FD_ISSET(clifd[i],&infds)) {
n = read(clifd[i],msg,BUFLEN);
if((n==0)||(n==-1)) {
/*收到 FIN 或 RST,非正常关闭 */
strcpy(broadmsg,cliid[i]);
strcat(broadmsg,"is DROPPED!\n");
/* 广播该客户端掉线的消息 */
close(clifd[i]);
clifd[i] = 0; /* 句柄置空,以便重用*/
cliid[i][0] = 0 ;/* id 置空 */
}
msg[n] = 0;
switch(msg[0]) {
case 3 :
strncpy(broadmsg,msg+1,n-1);
broadmsg[n-1] = 0;
printf("broadmsg:%s",broadmsg);
break;
case 1 :
slen = ( ((n-1)>IDLEN)?IDLEN:(n-1) );
strncpy( cliid[i],msg+1,slen );
/* 截断过长的id */
cliid[i][slen] = 0;
/* 字符串结束标志 '\0'*/
strcpy(broadmsg,cliid[i]);
strcat(broadmsg,"ENTERED!\n");
break;
case 2 :
strcpy(broadmsg,cliid[i]);
strcat(broadmsg,"is LEAVING!\n");
close(clifd[i]);
clifd[i] = 0 ;/* reset to 0 */
cliid[i][0] = 0; /* set null id */
break;
default :
broadmsg[0] = 0; /* NULL message */
}
break;
/* 每循环一次只处理一个客户,防止广播信息丢失 */
} /* 结束在 clifd 中的循环 */
if(broadmsg[0]!=0) {
for(i=0;i<MAXCLI;i++)
if(clifd[i]!=0)
write(clifd[i],broadmsg,strlen(broadmsg));
broadmsg[0] = 0; /* clear broadmsg */
}
} /* for(;;) end */
} /*main end */








...全文
17 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
antluo 2004-04-15
  • 打赏
  • 举报
回复
d
ljf88888 2004-04-03
  • 打赏
  • 举报
回复
UPUP给分....我穷呀..哈哈.
sen6888 2004-04-03
  • 打赏
  • 举报
回复
f
x014 2004-03-19
  • 打赏
  • 举报
回复
up
x014 2004-03-17
  • 打赏
  • 举报
回复
up
sen6888 2004-03-17
  • 打赏
  • 举报
回复
大家帮帮忙吧...
x014 2004-03-16
  • 打赏
  • 举报
回复
up
sen6888 2004-03-16
  • 打赏
  • 举报
回复
帮顶吧....
sen6888 2004-03-16
  • 打赏
  • 举报
回复
帮顶吧....
sen6888 2004-03-16
  • 打赏
  • 举报
回复
帮顶吧....

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧