文章目录
Socket服务器设计实现迭代型的echo服务器
代码仓库地址
Socket服务器设计
对于使用socket的网络服务器端程序,有两种常见的设计方式:
迭代式:服务器每次只处理一个客户端,只有当完全处理完一个客户端的请求后才会去处理下一个客户端并发型:能够同时处理单个客户端的请求
实现迭代型的echo服务器
#include <syslog.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "sys_tem.h"
#define BD_NO_CHDIR 01
#define BD_NO_CLOSE_FILES 02
#define BD_NO_REOPEN_STD_FDS 04
#define BD_NO_UMASK0 010
#define BD_MAX_CLOSE 8192
int becomeDaemon(int flags
);
int becomeDaemon(int flags
)
{
int maxfd
, fd
;
switch (fork()) {
case -1: return -1;
case 0: break;
default: _exit(EXIT_SUCCESS
);
}
if (setsid() == -1)
return -1;
switch (fork()) {
case -1: return -1;
case 0: break;
default: _exit(EXIT_SUCCESS
);
}
if (!(flags
& BD_NO_UMASK0
))
umask(0);
if (!(flags
& BD_NO_CHDIR
))
chdir("/");
if (!(flags
& BD_NO_CLOSE_FILES
)) {
maxfd
= sysconf(_SC_OPEN_MAX
);
if (maxfd
== -1)
maxfd
= BD_MAX_CLOSE
;
for (fd
= 0; fd
< maxfd
; fd
++)
close(fd
);
}
if (!(flags
& BD_NO_REOPEN_STD_FDS
)) {
close(STDIN_FILENO
);
fd
= open("/dev/null", O_RDWR
);
if (fd
!= STDIN_FILENO
)
return -1;
if (dup2(STDIN_FILENO
, STDOUT_FILENO
) != STDOUT_FILENO
)
return -1;
if (dup2(STDIN_FILENO
, STDERR_FILENO
) != STDERR_FILENO
)
return -1;
}
return 0;
}
#define SERVICE "echo"
#define BUF_SIZE 500
#define IS_ADDR_STR_LEN 4096
int main(int argc
, char *argv
[])
{
int sfd
;
ssize_t numRead
;
socklen_t len
;
struct sockaddr_storage claddr
;
char buf
[BUF_SIZE
];
char addrStr
[IS_ADDR_STR_LEN
];
if (becomeDaemon(0) == -1)
perror("becomeDaemon");
sfd
= inetBind(SERVICE
, SOCK_DGRAM
, NULL);
if (sfd
== -1) {
syslog(LOG_ERR
, "Could not create server socket (%s)", strerror(errno
));
exit(EXIT_FAILURE
);
}
for (;;) {
len
= sizeof(struct sockaddr_storage
);
numRead
= recvfrom(sfd
, buf
, BUF_SIZE
, 0,
(struct sockaddr
*) &claddr
, &len
);
if (numRead
== -1)
perror("recvfrom");
if (sendto(sfd
, buf
, numRead
, 0, (struct sockaddr
*) &claddr
, len
)
!= numRead
)
syslog(LOG_WARNING
, "Error echoing response to %s (%s)",
inetAddressStr((struct sockaddr
*) &claddr
, len
,
addrStr
, IS_ADDR_STR_LEN
),
strerror(errno
));
}
}