status = setsockopt(serverSocket, SOL_SOCKET,
SO_REUSEADDR,
(const char *) &on, sizeof(on));
if (-1 == status)
{
perror("setsockopt(...,SO_REUSEADDR,...)");
}
/* 当连接中断时,需要延迟关闭(linger)以保证所有数据都
* 被传输,所以需要打开SO_LINGER这个选项
* linger的结构在/usr/include/linux/socket.h中定义:
* struct linger
* {
* int l_onoff; /* Linger active */
* int l_linger; /* How long to linger */
* };
switch (childPid)
{
case -1: /* ERROR */
perror("fork()");
exit(1);
case 0: /* child process */
close(serverSocket);
if (-1 == getpeername(slaveSocket,
(struct sockaddr *) &clientName,
&clientLength))
{
perror("getpeername()");
}
else
{
printf("Connection request from %sn",
inet_ntoa(clientName.sin_addr));
}
/*
* Server application specific code
* goes here, e.g. perform some
* action, respond to client etc.
*/
write(slaveSocket, MESSAGE,
strlen(MESSAGE));
/* 也可以使用带缓存的ANSI函数fprint,
* 只要你记得必要时用fflush刷新缓存
*/
close(slaveSocket);
exit(0);