服务器端编程示例

int fd_set_nonblock(int fd)

{

int rv;

rv = fcntl(fd, F_GETFL, 0);

if(rv < 0){

printf("fcntl error\n");

return -1;

}

rv = fcntl(fd, F_SETFL, rv | O_NONBLOCK);

if(rv < 0){

printf("fcntl error\n");

return -1;

}

return 0;

}

int init_server_socket()

{

int fd;

struct sockaddr_in addr;

int ret;

int v_on = 1;

fd = socket(PF_INET, SOCK_STREAM, 0);

if (fd < 0) {

printf("server socket create failed\n");

return -1;

}

ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &v_on, sizeof (v_on));

if (ret != 0) {

printf("setsockopt error\n");

goto out_close_socket;

}

memset(&addr, 0, sizeof(struct sockaddr_in));

addr.sin_family = AF_INET;

addr.sin_addr.s_addr=INADDR_ANY;

addr.sin_port = htons(40000);

ret = bind(fd,(struct sockaddr *)&addr,sizeof(addr));

if (ret < 0) {

printf("Server socket bind error\n");

goto out_close_socket;

}

ret = listen(fd, 20);

if (ret < 0) {

printf("Server socket listen error\n");

goto out_close_socket;

}

ret = fd_set_nonblock(fd);

if(ret != 0){

printf("fd_set_nonblock() failed\n");

goto out_close_socket;

}

return fd;

out_close_socket:

close(fd);

return -1;

}

int main(int argc, char *argv[])

{

int listenfd;

int rv;

listenfd = init_server_socket();

if (listenfd < 0) {

exit(1);

}

while(1){

fd_set readfds;

struct timeval t;

int connfd;

structsockaddr_in clientaddr;

socklen_t addrlen;

int r;

FD_ZERO(&readfds);

if(listenfd >= 0)FD_SET(listenfd, &readfds);

t.tv_sec = 60;

t.tv_usec = 0;

r = select(listenfd+1, &readfds, NULL, NULL, &t);

if(r == 0){

continue;

}

if(r < 0){

if(errno != EINTR)

printf("signal caught\n");

continue;

}

if(!FD_ISSET(listenfd, &readfds))

continue;

memset(&clientaddr, 0, sizeof(struct sockaddr_in));

addrlen = sizeof(struct sockaddr_in);

connfd = accept(listenfd,(struct sockaddr *)&clientaddr, &addrlen);

if(connfd < 0){

continue;

}

/**********工作线程**********/

}

close(listenfd);

return 0;

}

服务器端编程示例

时间: 2024-10-09 21:09:01

服务器端编程示例的相关文章

Windows Socket编程示例-TCP示例程序

前面一部分是介绍,后面有示例 1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问题,网络层的"ip地址"可以唯一标识网络中的主机,而传输层的"协议+端口"可以唯一标识主机中的应用程序(进程).这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互. 使用TCP

多线程和异步编程示例和实践-踩过的坑

上两篇文章,主要介绍了Thread.ThreadPool和TPL 多线程异步编程示例和实践-Thread和ThreadPool 多线程异步编程示例和实践-Task 本文中,分享两则我们在做多线程和异步编程中实际踩过的坑,实际生产环境遇到的问题,以及解决办法. 1. HttpClient 业务场景:使用HttpClient实现第三方业务推送,当第三方的Http服务器不通.或者返回很慢时 线程数暴涨 Asp.Net\Asp.Net MVC场景下,并发多线程导致的线程阻塞:HttpClient.Pos

OpenCV SVM多类分类问题编程示例

2014年4月,北京--TechExcel喜签网目信息技术(上海)有限公司(以下简称"网目信息"),采用TechExcel公司CustomerWise产品助力其建立全球用户统一门户,统一各分公司的服务标准和服务流程,为用户提供全球标准化的服务. ICONZ-Webvisions公司(网目信息)总部设在新加坡,拥有20多年的IT运维及外包服务经验历史,是唯一以亚洲为中心,为亚洲.澳大利亚和全球市场提供"云"和托管服务的供应商.ICONZ-Webvisions可以利用其

多线程异步编程示例和实践-Thread和ThreadPool

说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启动线程 2. 暂停线程 当前线程在执行Thread.Sleep方法时,会等待指定的时间(1000ms)此时,当前线程处于阻塞状态:WaitSleepJoin 3. 线程等待 当程序运行时,启动了一个耗时较长的线程打印数字,每次打印输出前需要等待1000ms,我们在主程序中调用ThreadJoin方法

《Linux多线程服务器端编程》读书笔记第3章

<Linux多线程服务器端编程>第3章主要讲的是多线程服务器的适用场合与常用的编程模型. 1.进程和线程 一个进程是"内存中正在运行的程序“.每个进程都有自己独立的地址空间(address space).将"进程"比喻为"人",每个人都有自己的记忆(memory),人与人通过谈话(消息传递)来交流,谈话既可以是面谈(同一台服务器),也可以在电话里谈(不同的服务器,有网络通信).面谈和电话谈的区别在于,面谈可以立即知道对方是否死了(crash,S

1.4 函数式编程示例

下面的这些示例表明,函数式编程并不是任何意义上的理论学科,你会发现,甚至可能通过现有的 .NET 方法,应用了一些函数式思想.阅读有关函数式编程的内容,将有助于更深层次地理解这些技术,并高效地使用.在这书的后面,我们还将通过一些示例来展示函数式风格重要的实际好处.在第一组示例中,我们将探讨声明式编程. 1.4 函数式编程示例

Qt 5入门指南之Qt Quick编程示例

编程示例 使用Qt创建应用程序是十分简单的.考虑到你的使用习惯,我们编写了两套教程来实现两个相似的应用程序,但是使用了 不同的方法.在开始之前,请确保你已经下载了QtSDK的商业版本或者开源版本,并且你也已经熟悉了Qt的开发工具.QtSDK 提供了QtCreator集成开发环境使得开发Qt的应用程序十分简单. 用户界面的选择 除了直观上知道Qt是跨平台的,提供了包括线程,网络通信以及视频回放和网络摄像头等的跨平台抽象外,Qt提供了两种 独立的方法创建用户界面. QtQuick模块为创建流畅的.活

服务器端编程心得(三)—— 一个服务器程序的架构介绍

本文将介绍我曾经做过的一个项目的服务器架构和服务器编程的一些重要细节. 一.程序运行环境 操作系统:centos 7.0 编译器:gcc/g++ 4.8.3     cmake 2.8.11 mysql数据库:5.5.47 项目代码管理工具:VS2013 二.程序结构 该程序总共有17个线程,其中分为9个数据库工作线程D和一个日志线程L,6个普通工作线程W,一个主线程M.(以下会用这些字母来代指这些线程) (一).数据库工作线程的用途 9个数据库工作线程在线程启动之初,与mysql建立连接,也就

服务器端编程

我们的整个讨论都忽略了服务器端编程的问题.如果向服务器发出一个请求,会发生什么事情?大多数时候 的请求都是很简单的一个"把这个文件发给我".浏览器随后会按适当的形式解释这个文件:作为HTML 页. 一幅图.一个Java 程序片.一个脚本程序等等.向服务器发出的较复杂的请求通常涉及到对一个数据库进行 操作(事务处理).其中最常见的就是发出一个数据库检索命令,得到结果后,服务器会把它格式化成HTML 页,并作为结果传回来(当然,假如客户通过 Java 或者某种脚本语言具有了更高的智能,那么