Linux聊天室 搭建服务器
2017-02-10 19:10
381 查看
最近自己在写c语言中的聊天室项目,简单点说即利用网络编程让不同终端的用户进行聊天等,要想做出好的聊天室项目出来,基础最重要也就是说要搭建好服务器和客户端的架构,服务器端:
(1)创建监听套接字:listen_sockfd = socket(AF_INET, SOCK_STREAM, 0); if (listen_sockfd == -1) { perror("create socket error"); return -1; }(2)初始化服务器地址结构:
bzero(&server_addr, sizeof(server_addr)); // 将地址结构变量清零 server_addr.sin_family = AF_INET; // 选择IPV4地址 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听本地任意IP地址 server_addr.sin_port = htons(SERV_PORT); // 将本地端口号转化为网络端口号(3)绑定本地地址和端口号:
ret = bind(listen_sockfd, (struct sockaddr *)&server_addr, sizeof (server_addr)); if (ret == -1) { perror ("bind error"); return -1; }(4)监听套接字:
ret = listen(listen_sockfd, 20); if (ret == -1) { perror("listen error"); return -1; }
(5)接下来就是让服务器接收客户端的连接请求,为了使服务器能一直保持运行状态这里便用了一个while(1)循环,同时每连接进来一个服务器便给它创建一个线程专门去处理客户端的请求:
while(1) { client_len = sizeof(client_addr); clientfd = accept(listen_sockfd, (struct sockaddr *)&client_addr, &client_len); if (clientfd == -1) { perror("accept error"); return -1; } else { printf("连接成功\n"); } // 创建线程处理客户端请求 ret = pthread_create(&tid, NULL, (void *)server_request, (void *)clientfd); if (ret != 0) { printf ("create pthread error!\n"); return -1; } }然后将客户端的结构搭建起来,客户端主要是发送和接受两个大的功能,一开始自己在主线程中直接创建了两个线程,分别用来读和写,但后来发现这样做两个线程的读写之间会发生不该有的一系列错误,而且还浪费了主线程这条主线路,便只在主函数中创建了一个读线程只用来接受服务器的传过来的信息,主线程则用来面向客户输入指令给服务器,下面则是客户端基本架构的代码:
int main(int argc , char *argv[]) { struct sockaddr_in client_addr; // 服务器地址结构 int server_sockfd ; int ret ; pthread_t pid1;//创建线程的ID pthread_t pid2; if(argc != 2) { printf("对不起 您的输入有误 记得输入服务器的地址哦\n") ; return -1 ; } //创建监听套接字 server_sockfd = socket(AF_INET, SOCK_STREAM, 0); if (server_sockfd == -1) { perror("创建 socket 失败"); return -1; } // 初始化服务器地址结构 bzero(&client_addr, sizeof(client_addr)); // 将地址结构变量清零 client_addr.sin_family = AF_INET; // 选择IPV4地址 inet_aton(argv[1], &client_addr.sin_addr); // 填写服务器地址 client_addr.sin_port = htons(SERV_PORT); // 填写服务器端口 // 连接服务器 ret = connect(server_sockfd, (struct sockaddr *)&client_addr, sizeof (client_addr)); if (ret != 0) { perror("connect error"); return -1; } // 创建接受消息线程 ret = pthread_create(&pid1, NULL, (void *)read_from_server, (void *)server_sockfd); if (ret != 0) { printf ("对不起 创建线程失败!\n"); return -1; } //主线程专门写消息 write_to_server(server_sockfd) ; //关闭连接 close(server_sockfd); return 0; }
相关文章推荐
- linux开发服务器环境搭建
- 组网不求人!搭建简易Linux局网服务器
- [转]linux下fms2流媒体服务器搭建之一-----ffmpeg安装篇
- [转]linux下fms2流媒体服务器搭建之五-----flv播放器制作篇
- [转]linux下fms2流媒体服务器搭建之六-----在线视频录制篇
- 在Linux下如何快速搭建安全的FTP服务器
- LINUX下的FTP服务器的搭建
- linux环境下轻松搭建CVS服务器(还是转的)
- Linux系统下SVN服务器的搭建过程详解 ZT
- [转]linux下的fms2流媒体服务器搭建六部曲之一-----ffmpeg安装篇
- 搭建简单的Linux操作系统局域网服务器
- Linux下流媒体服务器的搭建(HelixServer)
- [转]linux下的fms2流媒体服务器搭建六部曲之五-----flv播放器制作篇
- 在Linux上搭建WEB服务器:基本概念、PHP zt
- Linux系统下SVN服务器的搭建过程详解
- [转]linux下的fms2流媒体服务器搭建六部曲之三-----FlashMediaServer安装篇
- [转]linux下fms2流媒体服务器搭建之三-----FMS安装篇
- Linux下搭建DHCP服务器