Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四)
延长server的生命周期
在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直接受处理连接的,知道结束命令结束掉server。
实现这种情况的最简单的方法便是将accept()
放置在一个死循环中,使得它能够一直的接受新的连接。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<netinet/in.h>
int main() {
int socket_desc, new_socket;
struct sockaddr_in server, client;
char *message;
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == socket_desc) {
perror("cannot create socket");
exit(1);
}
server.sin_addr.s_addr = INADDR_ANY;
server.sin_family = AF_INET;
server.sin_port = htons(8888);
if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("cannot bind socket");
exit(1);
}
puts("bind success");
listen(socket_desc, 5);
puts("waiting for incoing connections...");
socklen_t client_len = sizeof(client);
while((new_socket = accept(socket_desc, (struct sockaddr *)&client, &client_len))) {
puts("accept success");
message = "hello world";
send(new_socket, message, strlen(message), 0);
}
if (new_socket < 0) {
perror("accept error");
exit(1);
}
close(new_socket);
close(socket_desc);
return 0;
}
再次运行代码,向server发起多个请求,server都能够接受到,不信可以自己试试呦~
到现在为止,server端的全部功能都已经全部的实现,然而实现的这个server比较鸡肋,他每次只能处理一个请求,当多个请求来临时当前的请求就会阻塞掉后面的请求,直到当前的请求处理完成。
所以现在我们应该想办法让她能够同时处理多个连接了。
多线程处理多个连接
为了处理每一个连接请求,我们都需要为她们单独的运行一份代码,我们需要使得一份代码能够单独的运行,实现这种功能的方法有很多,这里就暂且说说多线程的方法。
当主程序接收到新的连接后,会创建一个新的线程去处理这个连接的事务,之后主程序会回去继续接受新的连接。
在Linux中我们可以使用pthread(posix threads)
库来使用多线程。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<netinet/in.h>
void *connection_handler(void *);
int main() {
int socket_desc, new_socket, *thread_socket;
struct sockaddr_in server,client;
socklen_t client_len;
char *message;
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == socket_desc) {
perror("cannot create socket");
exit(EXIT_FAILURE);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8888);
if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
puts("bind success");
listen(socket_desc, 5);
puts("waiting for incoming connections...");
client_len = sizeof(client);
while((new_socket = accept(socket_desc, (struct sockaddr *)&client, &client_len))) {
puts("connection accepted");
message = "Hello Client, now i will assign a handler for you\r\n";
send(new_socket, message, strlen(message), 0);
pthread_t sniffer_thread;
*thread_socket = new_socket;
if (pthread_create(&sniffer_thread, NULL, connection_handler, (void *)thread_socket) < 0) {
perror("cannot create thread");
exit(EXIT_FAILURE);
}
puts(Handler assigned);
}
if (new_socket < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
return 0;
}
void *connection_handler(void *socket_desc) {
int socket = *(int *)socket_desc;
char *message;
message = "Into connection handler\r\n";
send(socket, message, strlen(message), 0);
message = "communicate with client\r\n";
send(socket, message, strlen(message), 0);
return 0;
}
OK,到现在基本的socket编程的知识点几本全部说清楚了,后面需要在实践项目中不断的使用,巩固能力。
Linux下的C Socket编程 -- server端的继续研究的更多相关文章
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- Linux下的C++ socket编程实例
阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...
- linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- Linux下高并发网络编程
Linux下高并发网络编程 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户单一进程同时可打 ...
- Linux下高并发socket最大连接数所受的各种限制(详解)
1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...
- 从Linux源码看Socket(TCP)Client端的Connect
从Linux源码看Socket(TCP)Client端的Connect 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的 ...
随机推荐
- 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画
CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ...
- 我为NET狂官方面试题-数据库篇答案
题目:http://www.cnblogs.com/dunitian/p/6028838.html 汇总:http://www.cnblogs.com/dunitian/p/5977425.html ...
- javascript表单的Ajax 提交插件的使用
Ajax 提交插件 form.js 表单的下载地址:官方网站:http://malsup.com/jquery/form/ form.js 插件有两个核心方法:ajaxForm()和ajaxSubmi ...
- 原生javascript 固定表头原理与源码
我在工作中需要固定表头这个功能,我不想去找,没意思.于是就写了一个,我写的是angularjs 自定义指令 起了个 "fix-header" ,有人叫 "freeze- ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- Autofac - MVC/WebApi中的应用
Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...
- C++常见笔试面试要点以及常见问题
1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...
- required
required,这是HTML5中的一个新属性:这是HTML5中input元素中的一个属性. required译为必须的,在input元素中应用这一属性,就表示这一input元素节点是必填的或者必选的 ...
- iOS开发 适配iOS10
2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从Notificat ...
- 【从零开始学BPM,Day5】报表配置及自定义功能页面开发
[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第五天课程] 1.课程概要 Step 1 软件下载:H3 BP ...