Linux下TCP网络服务器实现源代码

2009-05-13 01:20:11来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

大家都知道各类网络服务器程序的编写步骤,并且都知道网络服务器就两大类:循环服务和并发服务。这里附上源代码来个小结吧。

首先,循环网络服务器编程实现的步骤是这样的:

这种服务器模型是典型循环服务,如果不加上多进程/线程技术,此种服务吞吐量有限,大家都可以看到,如果前一个连接服务数据没有收发完毕后面的连接没办法处理。所以一般有多进程技术,对一个新连接启用一个新进程去处理,而监听socket继续监听。

/************关于本文档********************************************
*filename:Linux下各类TCP网络服务器的实现源代码
*purpose:记录Linux下各类tcp服务程序源代码
*wroteby:zhoulifa(zhoulifa@163.com)周立发(http://zhoulifa.bokee.com)
Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言
*datetime:2006-07-0422:00:00
*Note:任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
*但请遵循GPL
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
*********************************************************************/

一个循环TCP服务源代码(因为用fork进行多进程服务了,所以这种服务现实中也有用)如下:

/*----------------------源代码开始--------------------------------------------*/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
/*********************************************************************
*filename:cycletcpserver.c
*purpose:循环tcp服务端程序
*tidiedby:zhoulifa(zhoulifa@163.com)周立发(http://zhoulifa.bokee.com)
Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言
*datetime:2006-07-0422:00:00
*Note:任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
*但请遵循GPL
*Thanksto:Google.com
*********************************************************************/
intmain(intargc,char**argv)
{
intsockfd,new_fd;/*监听socket:sock_fd,数据传输socket:new_fd*/
structsockaddr_inmy_addr;/*本机地址信息*/
structsockaddr_intheir_addr;/*客户地址信息*/
unsignedintsin_size,myport,lisnum;

if(argv[1])myport=atoi(argv[1]);
elsemyport=7838;

if(argv[2])lisnum=atoi(argv[2]);
elselisnum=2;

if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1){
perror("socket");
exit(1);
}
my_addr.sin_family=PF_INET;
my_addr.sin_port=htons(myport);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),0);
if(bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr))==-1){
perror("bind");
exit(1);
}

if(listen(sockfd,lisnum)==-1){
perror("listen");
exit(1);
}
while(1){
sin_size=sizeof(structsockaddr_in);
if((new_fd=accept(sockfd,(structsockaddr*)&their_addr,&sin_size))==-1){
perror("accept");
continue;
}
printf("server:gotconnectionfrom%s\n",inet_ntoa(their_addr.sin_addr));
if(!fork()){/*子进程代码段*/
if(send(new_fd,"Hello,world!\n",14,0)==-1){
perror("send");
close(new_fd);
exit(0);
}
}
close(new_fd);/*父进程不再需要该socket*/

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Linux与Windows共享建最简Samba

下一篇:打造基于Linux的VPN服务器