Linux 网络编程 epoll 文件描述符

乳酸奶 2015-08-30 11:26:55
服务器端新建一个监听套接字时,文件描述符是3;当客户端连接服务器时,新建一个连接套接字,该文件描述符应该是4才对吧?但实际输出是5,为什么呢?求助大神!

服务器代码(图片):


客户端代码(图片):


服务器代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/epoll.h>

int init_server(const char *ipstr, unsigned short port, int backlog)
{
int s = socket(PF_INET, SOCK_STREAM, 0);
if(0 > s){
perror("socket");
return -1;
}
printf("s = %d\n", s);
struct sockaddr_in addr = {
.sin_family = PF_INET,
.sin_port = htons(port),
.sin_addr = {
.s_addr = ((ipstr == NULL) ? INADDR_ANY : inet_addr(ipstr)),
},
};
memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
socklen_t len = sizeof(addr);
if(0 > bind(s, (struct sockaddr*)&addr, len)){
perror("bind");
return -1;
}

if(0 > listen(s, backlog)){
perror("listen");
return -1;
}

return s;
}

int add_event(int efd, int fd, unsigned int event)
{
struct epoll_event evt;
evt.events = event;
evt.data.fd = fd;
return epoll_ctl(efd, EPOLL_CTL_ADD, fd, &evt);
}

int del_event(int efd, int fd, unsigned int event)
{
struct epoll_event evt = {
.events = event,
.data = {
.fd = fd,
},
};
return epoll_ctl(efd, EPOLL_CTL_DEL, fd, &evt);
}

int main()
{
int s = init_server(NULL, 9999, 3);
if(0 > s){
return -1;
}

int efd = epoll_create(1);
if(0 > efd){
perror("epoll_create");
return -1;
}

if(0 > add_event(efd, s, EPOLLIN)){
perror("add_event");
return -1;
}

printf("Wait for a new comming ...\n");

#define MAX 1024
struct epoll_event evts[MAX];
int timeout = -1;
while(1){
int ret = epoll_wait(efd, evts, MAX, timeout);
if(0 > ret){
perror("epoll_wait");
break;
}else if(0 == ret){
printf("\tTimeout.\n");
continue;
}
int i;
for(i = 0; i < ret; i++){
if(s == evts[i].data.fd){
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
socklen_t len = sizeof(addr);

int rws = accept(s, (struct sockaddr*)&addr, &len);
if(0 > rws){
perror("accept");
close(s);
return -1;
}

printf("client %d :ip[%s]:port[%u]\n",
rws, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

if(0 > add_event(efd, rws, EPOLLIN)){
perror("add_event fail ");
close(rws);
}
}else{
char buf[MAX];
memset(buf, 0, MAX);
int num = recv(evts[i].data.fd, buf, MAX-1, 0);
if(0 >= num){
printf("id = %d, client %d leave.\n", i, evts[i].data.fd);
if(0 > del_event(efd, evts[i].data.fd, EPOLLIN))
perror("del fd");
close(evts[i].data.fd);
}else{
printf("socket[%d], RECV[%dbytes]:%s\n",
evts[i].data.fd, num, buf);
}
}
}
}
}



客户端代码:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


int main(int argc, char *argv[])
{
char *ipstr = "127.0.0.1";
unsigned short port = 9999;
if(argc == 3){
ipstr = argv[1];
port = atoi(argv[2]);
}

int c = socket(PF_INET, SOCK_STREAM,0);
if (c < 0){
perror("socket");
return -1;
}
struct sockaddr_in addr = {
.sin_family = PF_INET,
.sin_port = htons(port),
.sin_addr.s_addr = inet_addr(ipstr),
.sin_zero = {0},
};
if(connect(c, (struct sockaddr *)&addr,
sizeof(addr)) < 0){
perror("connect");
return -1;
}
int id = 0;
#define MAX 1024
char buf[MAX];
int size;
while(1){
snprintf(buf, MAX, "NO.%d: hello world", id++);
size = strlen(buf);
if (0 >= send(c, buf, size, 0)){
printf("Send fail!\n");
break;
}

printf("send: [%dbytes]: %s\n", size, buf);
sleep(1);
}
close(c);
return 0;
}



测试结果:
...全文
113 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
乳酸奶 2015-08-30
  • 打赏
  • 举报
回复
感谢大神,完美简洁解决我的问题了!
JiangWenjie2014 2015-08-30
  • 打赏
  • 举报
回复
stdin:0 stdout:1 stderr:2 listenfd:3 epollfd:4 clientfd:5

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧