`
lesorb
  • 浏览: 123349 次
  • 性别: 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基础.docx

    【C语言编程-socket基础】 在互联网编程中,C语言的socket编程是构建网络应用程序的基础。...理解并熟练运用这些函数和概念,是掌握C语言socket编程的关键,能够帮助开发者构建高效稳定的网络应用。

    C语言socket服务器端源码

    本文将深入探讨“C语言socket服务器端源码”这一主题,特别是使用`select`函数来管理多个客户端连接的情况。 首先,我们要了解什么是Socket。Socket是操作系统提供的一种进程间通信(IPC)机制,它允许程序通过网络...

    C语言SOCKET编程--超级完整.doc

    ### C语言SOCKET编程知识点详解 #### 一、Socket编程概览 - **定义与概念**: - **Socket**(套接字)是一种用于进程间通信的机制,允许一个程序通过网络与其他程序进行交流。 - 在Unix系统中,一切皆视为文件,...

    C语言56-1:数据发送程序.rar

    数据发送通常是在应用层进行,通过套接字(socket)接口实现。 2. **套接字编程**:C语言中的套接字API是进行网络通信的核心。`socket()`函数用于创建套接字,`bind()`用于将套接字与特定的IP地址和端口号绑定,`...

    ssdp协议c语言实现

    可以使用select、poll或者epoll等I/O多路复用机制来实现。 5. **缓存管理**:虽然项目描述中提到设备缓存过期功能尚未实现,但这是SSDP协议中的一个重要部分。设备会发送包含其缓存生命周期的NOTIFY消息,客户端...

    c语言套接字用select实现多用户连接

    本篇将详细介绍如何使用C语言的套接字和`select`函数来实现多用户连接。 一、套接字基础 套接字(Socket)是网络通信中的基本概念,它相当于网络上的通信端点。在C语言中,我们使用`socket()`函数创建套接字,`bind...

    C语言Socket编程指南

    本文档旨在为初学者提供一份详尽的C语言Socket编程指南,特别关注服务器与客户端程序、Select()阻塞Socket等核心概念和技术细节。以下是根据标题、描述及部分文档内容提炼出的关键知识点。 ### 1. 套接字的基本...

    C语言基于socket多人聊天

    在IT领域,网络编程是不可或缺的一部分,而C语言凭借其高效和灵活性,常被用于实现底层的网络通信。本项目“C语言基于socket多人聊天”就是利用C语言和socket API来构建一个支持多人实时交流的聊天系统。接下来,...

    C语言Socket简单编程指南

    C语言Socket编程是网络编程中的一项重要技术,它允许程序之间通过网络进行通信。Socket编程通常涉及到了解套接字(Socket)的基本概念、网络理论、各种网络编程函数以及如何处理IP地址等问题。以下是从提供的文件...

    c语言socket编程-超级完整.doc

    ### c语言socket编程知识点 #### 1. 什么是Socket? Socket是一种用于进程间通信的机制,允许不同计算机上的应用程序相互通信。在Unix系统中,一切皆文件,Socket也不例外,它本质上是一个文件描述符,用于表示...

    深入理解C语言中的Socket编程

    Socket编程是计算机网络通信的核心技术之一,特别是在C语言中,它是构建网络应用的基础。本教程将深入探讨C语言中的Socket编程,帮助你理解和掌握如何利用Socket接口进行网络通信。 首先,Socket是操作系统提供的一...

    C语言 TCP/IP 网络 socket 通信 源码

    在C语言中,TCP/IP socket编程涉及到的其他关键点还包括错误处理(如`errno`和`perror()`),套接字选项(`setsockopt()`和`getsockopt()`),多路复用(`select()`或`poll()`)以支持同时处理多个连接,以及异步I/O...

    C语言socket通讯TXT文件传输

    本主题聚焦于"C语言socket通讯TXT文件传输",它涉及到客户端和服务器端的编程,以及通过IP地址进行文件的定位和传输。下面将详细阐述相关知识点。 1. **Socket编程**:Socket是网络编程的基础,它提供了一种进程间...

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

    通过上述步骤,我们可以构建一个基本的C语言socket编程的客户端程序,并实现与服务器的长连接。在实际项目中,可能还需要考虑更多的因素,比如安全性、性能优化、并发处理等,这些都是网络编程深入研究的内容。同时...

    Socket C语言的实现.zip

    9. **示例代码**:压缩包内的"222"文件可能是包含C语言Socket编程的示例代码,比如简单的TCP服务器和客户端的实现,或者更复杂的多线程服务器等。 通过学习和理解以上知识点,你将能够利用C语言的Socket API构建...

    Linux网络编程-网络基础-socket编程-高并发服务器.pdf

    - I/O复用:如select、poll、epoll等机制,允许单个线程监控多个socket,当某个socket准备就绪时才进行读写操作,提高效率。 - 非阻塞I/O:将socket设置为非阻塞模式,避免在等待数据时阻塞其他操作。 - 异步I/O:如...

    windows下select和socket配合实现多路复用技术

    ### Windows下select与socket结合实现多路复用技术 #### 一、引言 在Windows平台上,使用C语言实现一个高效的聊天平台时,一个关键的技术挑战是如何管理多个客户端的连接和数据传输。为了应对这一挑战,开发人员...

    TCP通讯的C语言实现

    在C语言中实现TCP通讯,我们需要利用套接字(socket)API,这是操作系统提供的用于网络编程的接口。 首先,创建TCP服务器端的过程包括以下步骤: 1. **创建套接字**:使用`socket()`函数创建一个套接字描述符,指定...

    c语言实现客户端与服务端的通信

    "C语言实现客户端与服务端的通信" 在计算机网络中,客户端与服务端的通信是最基本也是最重要的一种通信方式。通过使用 socket 编程,我们可以实现客户端与服务端之间的数据交换。下面,我们将详细介绍如何使用 C ...

Global site tag (gtag.js) - Google Analytics