在回射程序的基础上,设计一个类似于群聊的应用
与改进1相比增加的设计:
1.将每个客户端发出的消息增加一个字符串,用于表示发送者的身份
2.服务端将收到的每个客户端消息转发给其他已连接的客户端套接字
改进1:https://www.cnblogs.com/lnlin/p/9568279.html
改进的思考过程:
1.消息头的增加:
增加一个客户端mian函数参数,用于表示用户名。
将每个客户端用户名添加到客户端发送的消息头部来表名某个消息发送者的身份,添加方式:
a.在客户端在标准输入输入消息后,客户端自动将此客户端用户用户名字符串添加到消息头部,再将
添加了用户名的消息发送给服务端
b.在客户端与服务端建立连接后,将客户端用户名发送给服务端,服务端保存此用户名,并在转发客
户端消息时,将相应用户名添加到相应消息数据中
下面的实现选用 a 方法,原因是我考虑到这么做虽然增加了客户端发送给服务端的消息长度,但减少
了客户端所需要的操作。
客户端main函数:
1 #include "net.h" 2 3 int main(int argc, char **argv) 4 { 5 int sockfd; 6 7 if (argc != 3) 8 { 9 printf("Error arg! "); 10 exit(1); 11 } 12 13 printf("%s ", argv[2]); 14 15 sockfd = tcp_connect(argv[1], SERV_PORT); 16 printf("Success init, the connected socket is %d ", sockfd); 17 cli_io(sockfd, argv[2]); 18 19 return 0; 20 }
将一个字符串添加到另一个字符串头部:
35 // 将一个字符串放到另一个字符串的头部,构造将用户名加到客户发送的消息中 36 // 不提供对字符串空间大小的检查 37 char *addStrHead(char *head, char *row) 38 { 39 int headLen, rowLen, i; 40 headLen = strlen(head); 41 rowLen = strlen(row); 42 43 for (i = headLen + rowLen; i >= 0; i--) 44 { 45 if (i > headLen) 46 { 47 row[i] = row[i - headLen - 1]; 48 } 49 else if (i == headLen) 50 { 51 row[i] = ':'; 52 } 53 else 54 { 55 row[i] = head[i]; 56 } 57 } 58 59 row[headLen + rowLen + 1] = '