热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux下的csocket编程(4)server端的继续研究

linux下的Csocket编程(4)延长server的生命周期:在前面的一个个例子中,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
#include
#include
#include
#include
#include
#include
#includein.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 &#61; sizeof(sockaddr_in);
while(new_socket&#61;accept(sock_desc,(struct sockaddr*)&client,&socklen_size))
{
puts("waiting for incoing connectiongs...");
message&#61; "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;

再次运行代码&#xff0c;向server发起多个请求&#xff0c;server都能够收到&#xff0c;不信可以试试。

    到现在为止&#xff0c;server端的全部功能都已经实现&#xff0c;然而实现的这个server比较鸡肋&#xff0c;他每次只能处理一个请求&#xff0c;当多个请求来临时就会阻塞掉后面的请求&#xff0c;直到当前的请求处理完成。

所以我们现在应该想办法让它能够同时处理多个连接。

多线程处理多个连接&#xff1a;

为了处理每一个连接请求&#xff0c;我们都需要为他们单独的运行一份代码&#xff0c;我们需要使得一份代码能过单独的运行&#xff0c;实现这种功能的方法有很多&#xff0c;这里就暂且说说多线程的方法&#xff1a;

    当主程序接收到新的连接后&#xff0c;会创建一个新的线程去处理这个链接的事务&#xff0c;之后主程序会回去继续接受新的连接。

在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
#include
#include
#include
#inlcude
#include
#include
#includein.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&#61; socket(AF_INET,SOCK_STREAM,0);
if(-1&#61;&#61;sock_desc)
{
perror("socket");
exit(EXIT_FAILURE);
}
server.sin_family &#61; AF_INET;
server.sin_port &#61; htons(port);
server.sin_addr.s_addr &#61; INADDR_ANY;
if&#xff08;bind(sock_desc,(struct sockaddr*)&server,sizeof(server))<0&#xff09;
{
perror("bind");
exit(EXIT_FAILURE);
}
puts("bind ok");
listen(sock_desc,5);
puts("waiting for incoming connections...");
client_len &#61; sizeof(client);
while((new_socket&#61; accept(sock_desc,(struct sockaddr*)&client,&client_len)))
{
puts("connections accepted");
message &#61; "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 &#61; 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 &#61; * (int *)sock_desc;
char *message;
message &#61; "into connection handler\n";
send(socket,message,sizeof(message),0);
message&#61; "communicate with client \n";
send(socket,message,sizeof(message),0);
return 0;
}

OK,到现在基本的socket编程的知识点基本全部说清楚了&#xff0c;后面需要在实践项目中不断使用&#xff0c;巩固能力。

 


转载于:https://www.cnblogs.com/yjds/p/8597353.html


推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • PyCharm中配置Pylint静态代码分析工具
    本文详细介绍如何在PyCharm中配置和使用Pylint,帮助开发者进行静态代码检查,确保代码符合PEP8规范,提高代码质量。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
author-avatar
道义信_686
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有