linux下的c socket编程(4)--server端的继续研究
linux下的C socket编程(4)
延长server的生命周期:
在前面的一个个例子中,server在处理完一个链接之后便会立即结束掉自己,然而这种server并不科学,server因该使能够一直接受处理连接的,知道结束命令结束掉server。
实现这种情况的最简单的方法就是将accept()放置在一个死循环中,使得它能够一直的接受新的 连接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
# include <stdio.h>
# include <strinh.h>
# include <stdlib.h>
# include <sys/socket.h>
# include <arpa/inet.h>
# include <sys/types.h>
# include <unistd.h>
# include <netinet/ in .h>
int main()
{
int socket_desc,new_socket;
struct sockadddr_in server,client;
char * message;
sock_desc= socket(AF_INET,SOCKE_TREAM, 0 );
if (- 1 == sock_desc)
{
perror( "socket" );
exit( 1 );
}
server.sin_family= AF_INET;
server.sin_port = htons( 8888 );
server.sin_addr_s_addr = INADDR_ANY;
if (bind(sock_desc,(struct sockaddr*)&server,sizeof(server))< 0 )
{
perror( "bind" );
exit( 1 );
}
puts( "bind success" );
listen(sock_desc, 5 );
puts( "waiting for incoing connectiongs" );
socklen_t socklen_size = sizeof(sockaddr_in);
while (new_socket=accept(sock_desc,(struct sockaddr*)&client,&socklen_size))
{
puts( "waiting for incoing connectiongs..." );
message= "hello world \n" ;
send(new_socket,message,strlen(message), 0 );
}
if (new_socket< 0 )
{
perror( "accept error" );
exit( 1 );
}
close(new_socket);
close(sock_desc);
return 0 ;
|
再次运行代码,向server发起多个请求,server都能够收到,不信可以试试。
到现在为止,server端的全部功能都已经实现,然而实现的这个server比较鸡肋,他每次只能处理一个请求,当多个请求来临时就会阻塞掉后面的请求,直到当前的请求处理完成。
所以我们现在应该想办法让它能够同时处理多个连接。
多线程处理多个连接:
为了处理每一个连接请求,我们都需要为他们单独的运行一份代码,我们需要使得一份代码能过单独的运行,实现这种功能的方法有很多,这里就暂且说说多线程的方法:
当主程序接收到新的连接后,会创建一个新的线程去处理这个链接的事务,之后主程序会回去继续接受新的连接。
在linux中我们使用pthread(posix threads)库来使用多线程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <sys/socket.h>
#inlcude<sys/types.h>
# include <arpa/inet.h>
# include <unistd.h>
# include <netinet/ in .h>
#define port 8888
void * connection_handler( void *);
int main()
{
int sock_desc,new_socket,* thread_socket;
struct sockaddr_in server,client;
scoklen_t client_len ;
char * message;
sock_desc= socket(AF_INET,SOCK_STREAM, 0 );
if (- 1 ==sock_desc)
{
perror( "socket" );
exit(EXIT_FAILURE);
}
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(sock_desc,(struct sockaddr*)&server,sizeof(server))< 0 )
{
perror( "bind" );
exit(EXIT_FAILURE);
}
puts( "bind ok" );
listen(sock_desc, 5 );
puts( "waiting for incoming connections..." );
client_len = sizeof(client);
while ((new_socket= accept(sock_desc,(struct sockaddr*)&client,&client_len)))
{
puts( "connections accepted" );
message = "hello client ,now i will assign a handler for you \r\n" ;
send(now_socket,message,sizeof(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(FAILURE);
}
return 0 ;
}
void * connection_handler( void * sock_desc)
{
int socket = * ( int *)sock_desc;
char *message;
message = "into connection handler\n" ;
send(socket,message,sizeof(message), 0 );
message= "communicate with client \n" ;
send(socket,message,sizeof(message), 0 );
return 0 ;
}
|
OK,到现在基本的socket编程的知识点基本全部说清楚了,后面需要在实践项目中不断使用,巩固能力。
转载于:https://www.cnblogs.com/yjds/p/8597353.html
linux下的c socket编程(4)--server端的继续研究相关推荐
- Linux下的C++ socket编程实例
阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...
- Linux下C语言Socket编程
(前期使用Ubuntu18.04,后期换成了Deepin20,但是二者都是Debian系的所以各种操作不耽误) 什么是Socket 英语socket是插座,插孔的意思,中文译作套接字: 插销和插座插在 ...
- Linux下的简单socket编程示例
API中用到的结构体 #1. struct sockaddr struct sockaddr { u_char sa_len; u_short sa_family; // address family ...
- linux下C语言socket网络编程简例
转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...
- Linux下高并发socket最大连接数所受的各种限制
修改最大打开文件数 # ulimit -n 修改最大进程数 # ulimit -u ------------------------------------------------------ Lin ...
- linux下查看系统socket读写缓冲区
一:linux下查看系统socket读写缓冲区大小配置: http://blog.csdn.net/herecles/article/details/8146017 1. tcp 收发缓冲区默认值 [ ...
- Linux进程最大socket数,Linux下高并发socket最大连接数所受的各种限制(详解)
1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...
- linux socket文件数限制,Linux下高并发socket最大连接数所受的限制问题
Linux下高并发socket最大连接数所受的限制问题1.修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对 ...
- Linux下C++ UDP Socket例子
这里我们给出了linux下C++的socket代码如下: #include <iostream> #include <stdio.h> #include <sys/soc ...
最新文章
- ubuntu安装qwt出现错误时"mkdir: 无法创建目录“/usr/local/qwt-6.1.3“: 权限不够"
- Eclipse搭建SpringCloud+SSM+Maven项目
- 《象与骑象人》总结一
- SAP CRM BCSet activation debug
- Java——集合框架(List)
- 学习API 判断光驱是否为光盘
- 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP
- C语言程序设计(第三版)何钦铭著 习题6-3
- 佛系前端面试题记录--第四周
- 在安装Maven检查版本时出现Please set the JAVA_HOME variable in your environment to match the locat
- 考拉消息中心消息盒子处理重构(策略模式)
- 路由之HSRP热备份
- 寻找《幸福派》和《不文集》
- python爬取疫情数据并存入excel中(包括国内各省份,全球,国内外历史疫情数据)代码可以直接运行
- 区块链世界的流量聚集地
- 享受知识饕餮盛宴,尽在近期课程安排
- C语言设计一除法器,verilog 除法器
- @ViewBuilder 在自定义 View 中的使用
- 内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单...
- 卷毛机器人符文_从零开始教:辅助必学机器人,练好轻松上白金
热门文章
- python time智能等待_python中等待怎么表示
- 成都网络推广带大家了解一个好的标题需遵循的原则有哪些?
- 企业网络推广下的B站二次上市:致力于造就国内最具活力和创造力的内容社区...
- 网站SEO优化如何才能避免被搜索引擎惩罚?
- 网站长尾词布置需要注意什么事项?
- 网站收录上不去估计是这几个方面出了问题
- java sessionstate_在Java Web开发中自定义Session
- 空间刚架matlab_基本平面刚架MATLAB程序
- 开发日记-20190802 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 18
- Fast Flux技术——本质就是跳板,控制多个机器,同一域名指向极多的IP(TTL修改为0),以逃避追踪...