`
lesorb
  • 浏览: 121059 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c语言实现-socket之select

    博客分类:
  • c
阅读更多
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <errno.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdlib.h>

#define LISTENQ 5 
#define OPEN_MAX 1024
#define SERV_PORT  60088
#define MAX_LINE 1024
#define INFTIM -1

#define MAXEVENTS 1000

char szHtmlBuf[] = "HTTP/1.1 200 OK\r\n"
"Date: Mon, 02 Feb 2015 03:44:06 GMT \r\n"
"Expires:0 \r\n"
"Vary: Accept-Encoding\r\n"
"Content-Type: text/html; charset=gb2312\r\n"
"Content-Length: 46\r\n"
"\r\n"
"<html> <head>Welcome !!!</head> <body>LINUX SELECT</body></html>";

fd_set fds;

void echo_srv(int clientFd)
{
	char line[MAX_LINE];
	printf(" starting read data ... \n");
	int n = read(clientFd, line, sizeof(line));
	if(n < 0) {
		if(errno == ECONNRESET)
		{
			close(clientFd);
			FD_CLR(clientFd, &fds);
			printf(" network error! \n ");
		}
		else
		{
			printf(" network exception! \n ");
			exit(-1);
		}
	}
	else if(n == 0)
	{
		close(clientFd);
		FD_CLR(clientFd, &fds);
		printf( " normal return! \n " );
	}
	else
	{
		line[n] = 0;
		printf("receive data  %s \n ", line);

		write(clientFd, szHtmlBuf, sizeof(szHtmlBuf));
	}
}

int main()
{
	struct sockaddr_in cliaddr, servaddr;
	int listenFd = socket(AF_INET, SOCK_STREAM, 0);
	if( listenFd < 0)
	{
		printf(" socket function exec fail! \n ");
		return 1;
	}

	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

	servaddr.sin_port = htons(SERV_PORT);
	if(bind(listenFd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
	{
		printf("bind function exec fail! \n ");
		return 1;
	}

	if(listen(listenFd, LISTENQ) < 0)
	{
		printf("listen function exec fail! \n");
		return 1;
	}
	printf("listen function exec success! \n");

	int maxfd;
	FD_ZERO(&fds);

	do{
		FD_SET(listenFd, &fds);
		maxfd = listenFd + 1;
		int nRead = 0;
		if( (nRead = select(maxfd + 1, &fds, NULL, NULL, NULL)) < 0)
		{
			printf("select fail! \n");
			exit(-1);
		}
		printf("select find data Change\n");

		int i;
		for( i = 0; i <= maxfd && nRead > 0; i++)
		{
			if(!FD_ISSET(i, &fds))
			{
				continue;
			}
			--nRead;
			if(i == listenFd)
			{
				socklen_t clilen = sizeof(cliaddr);
				int connfd = accept(listenFd, (struct sockaddr*)&cliaddr, &clilen);
				if(connfd < 0)
				{
					if ((errno != EAGAIN) && (errno != EWOULDBLOCK)) 
					{
						printf( "fail to accept new client \n");
						continue;
					}
				}
				printf("Ip: %s come here !\n", inet_ntoa(cliaddr.sin_addr));
				FD_SET(connfd, &fds);
				maxfd = (connfd > maxfd ? connfd : maxfd);
			}
			else
			{
				echo_srv(i);
			}
		}

	}while(1);

	return 0;
}

编译:gcc -o select_socket select_socket_linux.c
启动:./select_socket
服务器打印:
listen function exec success!

在浏览器中访问:http://{IP}:60088
返回:

<html> <head>Welcome !!!</head> <body>LINUX SE

服务器打印:
select find data Change
Ip: {C-IP} come here !
select find data Change
starting read data ...
receive data  GET / HTTP/1.1
Host: {IP}:60088
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
分享到:
评论

相关推荐

    C语言socket服务器端源码

    C语言实现的服务器端socket编程,使用select对多个客户端进行处理。

    C语言Socket编程指南

    服务器与客户端程序 Select() 阻塞 Socket介绍

    Linux-socket编程指南

    1) 什么是套接字? 2) Internet 套接字的两种类型 3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 ...23) select()--多路同步I/O 24) 参考资料

    c语言socket编程 与服务器长连接的客户端程序

    c语言socket编程 与服务器长连接的客户端程序

    C语言SOCKEt编程指南.rar

    Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?...23) select()--多路同步I/O 24) 参考资料

    Select方式实现的socketServer程序示例

    Select方式实现的socketServer程序示例 在Window平台下VC6.0开发。

    Peer-to-Peer-Socket-C

    C中的点对点程序该程序涉及一个可以同时发送和接收的对等点,该对等点是使用C语言中的Socket编程创建的。可以在单独的终端环境中运行代码的多个实例,以形成对等聊天网络。 局限性该程序要求用户事先知道同一本地...

    c语言socket编程指南

    最基本最简单的入门概念级教程 适合初学者 目录: 1) 什么是套接字? 2) Internet 套接字的两种类型 3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 ...23) select()--多路同步I/O

    socket程序(各种socket模型,及libevent用法)

    socket程序,客户端 服务器,5种模型 select WSAAsyncSelect EventSelect select OVERLAPPED CompletionPort libevent 共9个程序,1个启动client工具,一个client程序,7个服务器程序,各不相同

    简单多线程socket聊天室程序(c语言)

    server实现数据转发,使用了socket中的accept,select,线程中的线程分离属性(PTHREAD_CREATE_DETACHED)等 client实现读和写的异步,也使用了线程分离属性。 直接实现多个client终端对话。 可做为新人学习的参考。

    VS2017实现Udp socket多线程通信(C++)

    包括UDP服务器客户端多线程通信程序(用select实现),基于Visual Studio2017实现,已编译测试过,用到的朋友记得关闭SDL检查

    网络编程socket-server-多个client

    应用select多路复用, linux, 使用C语言进行计时,在用户空间中可以使用C语言函数gettimeofday 得到时间,它的调用格式是:

    c++ 面试题 总结

    6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么? int n; if (n == 10) // 第一种判断方式 if (10 == n) // 第二种判断方式 如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少...

    Linux网络编程socket编程学习

    自学Linux网络编程关于socket...重点介绍多路I/O转接服务器的实现,包括select函数poll函数epoll函数;最后介绍了UDP协议的服务器编写和本地套接字的程序实现。资源里面有笔记,C语言代码,参考书及参考书包含的程序。

    C语言服务器,多版本

    libuv(timer、isprime、sleep),socket服务器(blocking、epoll、nonblocking、select、sequential、threaded)

    linux C socket 在QT上编写的简单聊天室

    简单运用socket和select知识编写,是一个select的精彩例子。 PS:在根目录下直接 qmake make ,就能运行,文件夹里也包含有可运行文件。

    基于Windows平台的MSP(消息发送)协议实现

    1. C语言 2. socket通信 3. 兼顾TCP和UDP 4. msp 消息发送协议 5. windows平台 6. 使用了select i/o多路复用机制

    socket网络编程

    //如果你用c语言,你需要通过#pragma comment(命令来连接静态库 int main(int argc, char* argv[]){ HANDLE hThread = NULL; //判断是否输入了端口号 if(argc!=3){ printf("Usage: %sPortNumber\n",argv[1])...

    基于linux c OICQ

    这是我打四的时候写的,现在拿出来给大家分享,基于linux c+vim+gcc+makefile 平台。 现在我毕业了,虽然当时写的代码安全性考虑的少,...特别是想网络编程的朋友,用的是linux的API socket。还有select简单的轮询技术。

    77G 22套C语言 C++ 数据结构 程序设计视频课程合集 C丨C++相关学习视频全套视频教程

    062.MFC_ADO_MSSQL_Select.mp4 063.MFC_MiniMS_1.mp4 064.MFC_MiniMS_2.mp4 065.MFC_MiniMS_3.mp4 066.WS_Socket_编程原理.mp4 067.WS_TCP_Socket.mp4 068.WS_TCP_Socket_Client.mp4 069.WS_UDP_Socket_...

Global site tag (gtag.js) - Google Analytics