面试总结---chat room的UDP聊天室软件

来源:互联网 发布:linux上新建weblogic域 编辑:程序博客网 时间:2024/06/05 09:52
今天面试的时候,面试官问道socket()套接字实现chat room聊天室。
下面的这个代码是chat_server.c的代码:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <netinet/in.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netdb.h>/************************************************************************函数名称:int main(int argc, char *argv[])函数功能:主函数,建立一个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_DGRAM, 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);//服务器IP地址int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));//服务器绑定特定的端口号if(err_log != 0){perror("bind");close(sockfd);exit(-1);}printf("%30s\n", "Welcome! this is UDP Chat Room");printf("Server Port is %d\n",port);while(1){char recv_buf[1024] = "";//定义接受数组大小struct sockaddr_in client_addr;//定义客户端通用套接字结构体char cli_ip[INET_ADDRSTRLEN] = "";socklen_t cliaddr_len = sizeof(client_addr);recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&client_addr, &cliaddr_len);inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);printf("\033[31m[%14s]:\033[32m%s\n", cli_ip, recv_buf);}close(sockfd);return 0;}
下面的是chat_client.c文件:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <netinet/in.h>#include <sys/socket.h>#include <arpa/inet.h>/************************************************************************函数名称:int main(int argc, char *argv[])函数功能:主函数,建立一个chat_client函数参数:可以传参改变服务器的ip地址和其端口号,亦可不传参使用默认值函数返回:无************************************************************************/int main(int argc, char *argv[]){unsigned short port = 8000;char *dest_ip = "172.20.223.151";if( argc > 1 )           //更改服务器ip地址{dest_ip = argv[1];}if( argc > 2 )//更改服务器端口号{port = atoi(argv[2]);}int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0)//创建UDP套接字{perror("socket error");exit(-1);}struct sockaddr_in dest_addr;bzero(&dest_addr, sizeof(dest_addr));dest_addr.sin_family = AF_INET;dest_addr.sin_port = htons(port);inet_pton(AF_INET, dest_ip, &dest_addr.sin_addr);printf("ready send data to UDP server %s:%d!\n", dest_ip, port);while(1){char send_buf[1024] = "";printf("SENDMSG>:");fgets(send_buf, sizeof(send_buf),stdin);send_buf[strlen(send_buf)-1] = '\0';if(strcmp(send_buf, "exit") == 0){close(sockfd);exit(0);}sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));}close(sockfd);return 0;}

下面是实现的对应的Makefile文件:
all:chat_room chat_clientTARGET = chat_room chat_clientCFLAGS = -WallCC = gccchat_room:chat_room.c$(CC) chat_room.c -o chat_room $(CFLAGS)chat_client:chat_client.c$(CC) chat_client.c -o chat_client $(CFLAGS)clean:rm -rf $(TARGET)

                                             
1 0
原创粉丝点击