热门标签 | 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


推荐阅读
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • C语言编写线程池的简单实现方法
    2019独角兽企业重金招聘Python工程师标准好文章,一起分享——有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带 ... [详细]
  • 本文介绍了如何使用 Google Colab 的免费 GPU 资源进行深度学习应用开发。Google Colab 是一个无需配置即可使用的云端 Jupyter 笔记本环境,支持多种深度学习框架,并且提供免费的 GPU 计算资源。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
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社区 版权所有