#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/select.h>
#define SERVER_PORT 8888
#define BACK_LOG 10
#define MAX_FD 64
/*socket
**bind
**listen
**accept
**send/recv
*/
int main(int argc, char **argv)
{
int iSocketServer;
int iRet;
int iSocketClient;
int iAddrLen;
int fd_sel;
unsigned char ucRecvBuf[1024];
int iRecvLen;
struct sockaddr_in tSockServerAddr;
struct sockaddr_in tSockClientAddr;
fd_set read_fd;
int max_fd;
int i;
int read_fds[MAX_FD];
//memset(read_fds, -1, MAX_FD);
for(i = 0; i < MAX_FD; i++)
{
read_fds[i] = -1;
}
signal(SIGCHLD, SIG_IGN);
iSocketServer = socket(AF_INET, SOCK_STREAM, 0);
if(iSocketServer == -1){
printf("socket error\n");
return -1;
}
tSockServerAddr.sin_family = AF_INET;
tSockServerAddr.sin_port = htons(SERVER_PORT);
tSockServerAddr.sin_addr.s_addr = INADDR_ANY;
memset(tSockServerAddr.sin_zero, 0, 8);
iRet = bind(iSocketServer, (const struct sockaddr *)&tSockServerAddr, sizeof(struct sockaddr));
if(iRet == -1){
printf("bind error\n");
return -1;
}
iRet = listen(iSocketServer, BACK_LOG);
if(iRet == -1){
printf("listen error\n");
return -1;
}
max_fd = iSocketServer;
read_fds[0] = iSocketServer;
while(1)
{
FD_ZERO(&read_fd);
for(i = 0; i < MAX_FD; i++)
{
if(read_fds[i] != -1)
{
FD_SET(read_fds[i], &read_fd);
if(max_fd < read_fds[i]){
max_fd = read_fds[i];
}
}
}
fd_sel = select(max_fd+1, &read_fd, NULL, NULL, NULL);
if(fd_sel == -1){
printf("select error\n");
return -1;
}
/* 首先判断监听套接字是否有连接 */
if(FD_ISSET(iSocketServer, &read_fd))
{
iAddrLen = sizeof(tSockClientAddr); //这个是必须的,否则得到的ip可能不正确
iSocketClient = accept(iSocketServer, (struct sockaddr *)&tSockClientAddr, &iAddrLen);
if(iSocketClient == -1){
printf("accept error\n");
return -1;
}
printf("Get Connect from client%d : %s\n", iSocketClient, inet_ntoa(tSockClientAddr.sin_addr));
for(i = 0; i < MAX_FD; i++)
{
if(read_fds[i] == -1)
{
read_fds[i] = iSocketClient;
break;
}
}
if(i == MAX_FD){
printf("too many connections!!\n");
close(iSocketClient);
continue;
}
}
/*判断 读写套接字是否有数据 */
for(i = 1; i < MAX_FD; i++)
{
if((read_fds[i] != -1) && FD_ISSET(read_fds[i], &read_fd))
{
iRecvLen = read(read_fds[i], ucRecvBuf, 1024);
if(iRecvLen <= 0)
{
/* iRecvLen <0 出错
* iRecvLen=0 客户断开连接
*/
if(iRecvLen == 0){
printf("disconnect from client %d\n", read_fds[i]);
}
close(read_fds[i]);
FD_CLR(read_fds[i], &read_fd);
read_fds[i] = -1;
continue;
}
ucRecvBuf[iRecvLen] = '\0';
printf("Get Msg from client%d : %s\n", read_fds[i], ucRecvBuf);
}
}
}
close(iSocketServer);
return 0;
}
linux下socket编程之以select方式实现并发服务器
4星 · 超过85%的资源 需积分: 47 30 浏览量
2014-11-26
20:54:51
上传
评论 3
收藏 2KB RAR 举报
jyjs_zh
- 粉丝: 0
- 资源: 5
最新资源
- Wireshark-4.2.4-x64.zip
- 2022年11月软件设计师上
- 基于VB+ACCESS教学管理系统(参考文献+源代码).zip
- 一个工具的流程图 demo
- EMC3080的用于连接FogCloud的固件
- 基于VB+Access酒店客房管理系统(源代码+参考文献+报告).zip
- 应用笔记LAT1244+奇怪的NRST+管脚异常复位问题
- SEMI标准的解释说明
- tensorflow-2.8.2-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-rocm-2.12.0.560-cp311-cp311-manylinux2014-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈