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

使用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);
}

相关文章:
简单的服务器、客户端程序实验报告
用函数及结构体参考: 1、创建套接字——socket(...格式:int PASCAL FAR select(int nfds, fd_set ...形象地看到客户/服务器端的运作方式, 对于 C/S ...
windows编程中select函数的使用
windows编程中select函数的使用_计算机软件及应用_IT/...应用程序可通过 WSAGetLastError()获 取相应错误代码...
SELECT的使用方法
SELECT 语句可 以使数据库服务器根据客户的要求搜索...可以指定多个源表,各个源表之间“,”分割;若...expression 表达式可以是 列名、常量、函数,以及由...
客户服务器程序设计与实现
用函数及结构体参考: 1、创建套接字——socket(...格式:int PASCAL FAR select(int nfds, fd_set ...形象地看到客户/服务器端的运作方式, 对于 C/S ...
Linux下 各类TCP网络服务器的实现源代码
(这里到 socket()函数及函数 setsockopt()) | | \|/ 把 socket 和 IP ...select select_tut 的 man 手册里提供了这份源 代码 *Hope:希望越来越多的人...
第9章源代码
数据库原理与应用源代码数据库原理与应用源代码隐藏>...SELECT @rows 例 9-4 使服务器产生服务,并用显示...使用 datename 函数返回员工的出生日期的月份(mm)...
数据库 练习题(答案)
把嵌入的 SQL 语句处理成函数调用形式 C.对源程序...企业管理器的功能(D ) A、注册服务器 C、引入和...2、在查询操作结果中不出现重复元组,应在 Select ...
14秋北语《数据库应用(SQL_server)》作业
SQL Server 系统中的所有服务器级系统信息存储于哪个...视图 D. 标量用户定义函数 满分:5 分 得分:5 2...在客户端编写软件时使用 SQL 语句“SELECT * FROM ...
网络程序设计—ASP模拟试卷(二)
(A) 可以 (B) 不可以 (B) 搜狐网站是服务器端...中关键字 在 VBScript 中,我们检验函数 在于 ...("ADODB.Recordset") strSql ="Select * From ...
PHP_面试笔试题_01部分_选择题
<select name=“NAME”></select> 10.以下代码...C. 在使用 cookie 前要使用 cookie_start()函数...D. Cookie 是客户端技术,session 是服务器端技术。...
更多相关标签: