当前位置:首页 >> 计算机软件及应用 >>

使用select()函数的服务器端源代码


/* net_select.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#define PORT 4321
#define MAX_QUE_CONN_NM 5
#define MAX_SOCK_FD FD_SETSIZE
#define BUFFER_SIZE 1024

int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, count;
fd_set inset, tmp_inset;
int sockfd, client_fd, fd;
char buf[BUFFER_SIZE];

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero), 8);
int i = 1;/* 允许重复使用本地地址与套接字进行绑定 */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
if (bind(sockfd, (struct sockaddr *)&server_sockaddr,
sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}

if(listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen");
exit(1);
}
printf("listening....\n");
/*将调用socket()函数的描述符作为文件描述符*/
FD_ZERO(&inset);
FD_SET(sockfd, &inset);
while(1)
{
tmp_inset = inset;
sin_size=sizeof(struct sockaddr_in);
memset(buf, 0, sizeof(buf));
/*调用select()函数*/
if (!(select(MAX_SOCK_FD, &tmp_inset, NULL, NULL, NULL) > 0))
{
perror("select");
}
for (fd = 0; fd < MAX_SOCK_FD; fd++)
{
if (FD_ISSET(fd, &tmp_inset) > 0)
{
if (fd == sockfd)
{ /* 服务端接收客户端的连接请求 */
if ((client_fd = accept(sockfd,
(struct sockaddr *)&client_sockaddr, &sin_size))== -1)
{
perror("accept");
exit(1);
}
FD_SET(client_fd, &inset);
printf("New connection from %d(socket)\n", client_fd);
}
else /* 处理从客户端发来的消息 */
{
if ((count = recv(client_fd, buf, BUFFER_SIZE, 0)) > 0)
{
printf("Received a message from %d: %s\n",
client_fd, buf);
}
else
{
close(fd);
FD_CLR(fd, &inset);
printf("Client %d(socket) has left\n", fd);
}
}
} /* end of if FD_ISSET*/
} /* end of for fd*/
} /* end if while while*/
close(sockfd);
exit(0);
}


相关文章:
Select函数实现原理分析
Select函数实现原理分析_IT/计算机_专业资料。介绍Select函数使用方法!Select 函数实现原理分析 2009 年 05 月 12 日 星期二 下午 03:21 Select 函数实现原理分析...
select函数
哈夫曼编码算法中 select 函数的具体实现方法。有利于对其算法的理解 void Select(HuffmanTree HT,int i,int &s1,int &s2) //Select sub-function { int j,...
Linux下select函数的使用
Linux下select函数的使用_计算机软件及应用_IT/计算机_专业资料。Linux下select函数的使用方法 select 系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序...
Linux下select函数的使用
Linux下select函数的使用_计算机软件及应用_IT/计算机_专业资料。Linux 下 select 函数的使用 select 系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序...
select()函数说明
select()函数说明 函数说明 确定一个或多个套接口...错误代码 WSANOTINITIALISED:在使用此 API 之前应首先...
select 函数用法
select 函数用法_数学_自然科学_专业资料。Select 的...错误代码 执行成功则返回文件描述词状态已改变的个数...至于这方面的应用,主要在于服务方的父 Socket,你若...
Linux中select函数学习及实例笔记
(int fd, fd_set *fdset); 例如下面一段代码:...*使用 select 函数可以以非阻塞的方式和多个 socket...服务器端程序的正确性 //select_client.c #include...
SQL第12周上机作业(函数)答案
(grade) from sc where cno=@kehao group by cno) Return @ave End select dbo.cala (‘1’) as bb 6、定义内联表值函数,完成以下功能:根据输入的学号,...
Oracle数据库Select函数基本用法
1、当使用聚集函数时,SELECT 中的列不出现在聚集函数中就必须出现在 GROUP BY 中,否则会出现语法错误;例如下列语句是非法的: SELECT department_id, COUNT(last_...
在SELECT-SQL语句中,不能使用的函数是 ___。 A.AVGB.CO...
用于计算检索的函数有:COUNT-计数,SUM-求和,AVG-计算平均值,MAX-求最大值,MIN-求最小值。这些函数可以SELECT语句中对查询结果进行计算。SQL中没有EOF函数。...
更多相关标签: