面试总结---TCP实现的chat_room程序
来源:互联网 发布:51单片机和arm单片机 编辑:程序博客网 时间:2024/06/14 17:03
今天面试的时候遇到一个面试官问我关于socket套接字实现聊天室的功能的软件,上一篇博客写的是UDP的聊天室软件程序,现在这个是TCP聊天室的软件代码。
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>/************************************************************************函数名称:int main(int argc, char *argv[])函数功能:主函数,建立一个TCP Chat Room函数参数:可以传参改变自己的端口号,亦可不传参使用默认值函数返回:无************************************************************************/int main(int argc, char *argv[]){unsigned short port = 8000;if(argc >1){port = atoi(argv[1]);}int sockfd = socket(AF_INET, SOCK_STREAM,0);if(sockfd < 0){perror("socket");exit(-1);}struct sockaddr_in my_addr;bzero(&my_addr, sizeof(my_addr));my_addr.sin_family = AF_INET;my_addr.sin_port = htons(port);my_addr.sin_addr.s_addr = htonl(INADDR_ANY);int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));if(err_log != 0){perror("bind");close(sockfd);exit(-1);}err_log = listen(sockfd, 10);if(err_log != 0){printf("listen");close(sockfd);exit(-1);}struct sockaddr_in client_addr;char cli_ip[INET_ADDRSTRLEN] = "";socklen_t cliaddr_len = sizeof(client_addr);int connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len);if(connfd < 0){perror("accept");close(sockfd);exit(-1);}inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);while(1){char recv_buf[1024] ="";char send_buf[1024] ="";if(recv(connfd, recv_buf, sizeof(recv_buf), 0) == 0){printf("client closed!\n");close(sockfd);close(connfd);exit(-1);}printf("%s : %s\n", cli_ip, recv_buf);fgets(send_buf, sizeof(send_buf), stdin);send_buf[strlen(send_buf)-1] = '\0';send(connfd, send_buf, strlen(send_buf), 0);}close(sockfd);close(connfd);return 0;}
下面的这个是client部分的代码:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>/************************************************************************函数名称:int main(int argc, char *argv[])函数功能:主函数,建立一个TCP Echo Client函数参数:可以传参改变服务器的ip地址和其端口号,亦可不传参使用默认值函数返回:无************************************************************************/int main(int argc, char *argv[]){unsigned short port = 8000;char *server_ip = "172.20.223.55";if(argc > 1){server_ip = argv[1];}if(argc > 2){port = atoi(argv[2]);}int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket");exit(-1);}struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(port);inet_pton(AF_INET, server_ip, &server_addr.sin_addr);int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));if(err_log != 0){perror("connect");close(sockfd);exit(-1);}printf("connect to %s success\nplease input your message\n", server_ip);while(1){char send_buf[512] = "";char recv_buf[512] = "";fgets(send_buf, sizeof(send_buf), stdin);send_buf[strlen(send_buf)-1] = '\0';if(strcmp(send_buf, "exit") == 0){close(sockfd);exit(0);}send(sockfd, send_buf, strlen(send_buf), 0);recv(sockfd, recv_buf, sizeof(recv_buf), 0);printf("recv message:%s\n", recv_buf);}}
下面的部分是Makefile的代码:
all:server clientTARGET = server clientCFLAGS = -WallCC = gccserver:server.cgcc server.c -o server $(CFLAGS)client:client.cgcc client.c -o client $(CFLAGS)clean:rm -rf *.o $(TARGET)
1 0
- 面试总结---TCP实现的chat_room程序
- 【tcp-ip学习总结】使用tcp协议实现简单的通信小程序
- TCP面试相关总结
- 【tcp-ip学习总结】基础UDP实现的简单通信功能小程序
- TCP协议相关面试总结
- 面试前TCP/IP的总结与实践(一)
- 面试前TCP/IP的总结与实践(二)
- 面试前TCP/IP的总结与实践(三)
- 多连接的tcp/ip程序实现
- TCP初始化序列号ISN的程序实现
- TCP实现ECHO程序
- 面试总结,TCP和UDP分析
- 面试知识准备:TCP、UDP总结
- HTTP/TCP常见面试问题总结
- 面试总结:TCP三次握手、四次挥手
- 计算机网络--TCP协议面试知识点总结
- HTTP/TCP常见面试问题总结
- 基于QT的TCP协议实现的通信小程序
- 使用weave管理docker网络
- HDU 2553 N皇后问题
- 视图
- 算法----插入排序(insert sort)
- 解惑rJava R与Java的高速通道
- 面试总结---TCP实现的chat_room程序
- Linux常用命令(五) - rm
- 第十二周项目4-银行系统(一)
- C语言基础 内存区分与存储
- PHP实现的快速排序算法
- 二叉树的建立及递归遍历
- Android中编辑其他应用的SharedPreferences(二)
- linux 关于线程不安全函数localtime小记
- .hdu4288 Coder & CF85-DSum of Medians