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端的继续研究的更多相关文章

  1. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

  2. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  3. Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...

  4. Linux下的C++ socket编程实例

    阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...

  5. linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...

  6. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  7. Linux下高并发网络编程

      Linux下高并发网络编程 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户单一进程同时可打 ...

  8. Linux下高并发socket最大连接数所受的各种限制(详解)

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...

  9. 从Linux源码看Socket(TCP)Client端的Connect

    从Linux源码看Socket(TCP)Client端的Connect 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的 ...

随机推荐

  1. nohup程序后台执行

    Linux常用命令,用于不挂断的执行程序. nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令.该命令可以在你退出帐户/关闭终端之后继续运行相应 ...

  2. Angular企业级开发(5)-项目框架搭建

    1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...

  3. [C#] async 的三大返回类型

    async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...

  4. Android 6.0 权限知识学习笔记

    最近在项目上因为6.0运行时权限吃了亏,发现之前对运行时权限的理解不足,决定回炉重造,重新学习一下Android Permission. 进入正题: Android权限 在Android系统中,权限分 ...

  5. 运用php做投票题,例题

    要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...

  6. Create a Team in RHEL7

    SOLUTION VERIFIED September 13 2016 KB2620131 Environment Red Hat Enterprise Linux 7 NetworkManager ...

  7. iosselect:一个js picker项目,在H5中实现IOS的select下拉框效果

    具体文档和demo可以访问github:https://github.com/zhoushengmufc/iosselect 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的pi ...

  8. Linux下用netstat查看网络状态、端口状态(转)

    转:http://blog.csdn.net/guodongdongnumber1/article/details/11383019 在linux一般使用netstat 来查看系统端口使用情况步.  ...

  9. date命令

    GNU的date提供+%s(小写s), 能打印出自1970-01-01 00:00:00到当前时间的秒数. 这可能大家都不陌生,但有两点需要注意: 1. %s存在于GNU扩展版本.像在solaris等 ...

  10. 不该活着的SqlHelper和DBHelper

    前言: 还记得刚学ADO.NET的情景么? 还记得当年是怎么从ADO.NET被忽悠到用SqlHelper的么? 话说从入门到走上工作岗位那些年,我们就一直被纯纯地教导或引导,ADO.NET太原始,得封 ...