linux环境下的多人聊天程序设计

来源:互联网 发布:工业以太网知乎 编辑:程序博客网 时间:2024/06/06 02:44

STEP 1:老师给出了原始的程序,是功能不完善的,也就是让我们把发信息的用户名和时间啥的显示出来,这样不是比较合理嘛;原程序是可以实现传text的,就是没有用户名而已。

先跑一下(切换到你放这三文件的目录哦~):gcc -o chat chat.c 回车

然后:./chat 回车

再开一个终端:telnet 127.0.0.1 9999 回车

username:1 回车

再开一个终端:telnet 127.0.0.1 9999 回车

username:2 回车

tell 1 hello 回车

然后1那个终端就收到消息啦,也可以chat hello everyone 回车

这样相当于群聊,所有人都能收到消息,不指定某人。

STEP 2:改代码(加代码)

经我阅读代码后,决定修改chat.h里的tell_someone这个函数先,

看114行writen(chater[index].sock_fd ,new_data_p,n)==-1

就是说把new_data_p这个字符串写到套接字里,执行完这条语句之后其他人的终端就会显示出new_data_p了,所以我们把username加到这个字符串里就可以,主要用的是strcat和strcpy函数。

在tell_someone这个函数里,data_p就是原本要发送的消息(我们就是改造成username : data_p),chater[slot_index].user_id是发送者的username,new_data_p就是我们新构建的字符串,构造它的过程就是106~109行。

其中我犯得错误是一开始把new_data_p定义成了char *类型,然后把chater[slot_index].user_id的值赋给它了,后来我发现这是这指针类型,如果这样赋值,相当于把chater[slot_index].user_id的指针赋值给了new_data_p,那么new_data_p和chater[slot_index].user_id相当于公用一个地址了,那么也就是说我们如果修改new_data_p的值,实质上是那个地址里存的值改了,chater[slot_index].user_id是指向那个地址的,那么间接地就修改了chater[slot_index].user_id的值,也就是修改了username啊!那么我们再找原来的username为1或者2,就找不着了,而且它实际变成了new_data_p(想想一下一个用户名叫   "1 :hello  回车"  是不是醉了……);然后就把它定义成char[]了,这样就是取值而不是取地址了,然后用strcat把username、 : 、data_p一步步往new_data_p里加,其中strcat(a,b),指的是把b加到a的末尾,所以要保证a有足够的空间还能容纳b哦!~

STEP 3:修改chat_all和tell_someone是一样的,一共就改了三个地方,自己看看代码吧~如果想加上系统时间啥的,同理~


话说这个原理,还是大二上java实验时候学到的……很意外地从老师和同学(三儿)那得到的思路,挺好的~就是把自己的用户名和要发送的消息一起发给对方的做法~挺好的~觉得好有哲理哦~

0 0
原创粉丝点击