面试总结---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
原创粉丝点击