code_tin

从头编写高性能服务程序1-单进程阻塞
标题有些大.其实自己也是在不断的摸索 觉得BLOG的作用应该和日记一样 把自己获取到的东西记录下来 到时候回头看能...
扫描右侧二维码阅读全文
29
2010/01

从头编写高性能服务程序1-单进程阻塞

标题有些大.其实自己也是在不断的摸索
觉得BLOG的作用应该和日记一样
把自己获取到的东西记录下来
到时候回头看能找到自己跌倒过的地方避免再次跌倒
同时别人看的时候也能避开这些地方
所以在自己开始写服务程序一段时间之后
把原来的代码整理一下一次次的发上来
从零开始完全手写一个服务,经过慢慢的演化
期间的收获还是很多的

最开始,
程序是从最简单的socket连接开始
只有一个进程,创建socket之后开始listen
然后accept连上来的链接
整个程序是阻塞的.当一个链接上来之后
其他链接是无法连入的
之后当程序处理完并close之后,后面的才能被处理
这个例子是不停的接受客户端发过来的字符并且显示在服务端的console
然后客户端也不会被close.
只是演示概念
外面一个循环是不停的去accept新的连接
里面一个是循环处理已经accept上来链接的数据
由于没有close,所以外面一个循环是没意义的.呵呵
只是大家知道概念就OK了.

#include #include #include #include #include int main(){ int listen_fd,accept_fd,flag; struct sockaddr_in my_addr,remote_addr; if ( (listen_fd = socket( AF_INET,SOCK_STREAM,0 )) == -1 ){ perror("create socket error"); exit(1); } if ( setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&flag,sizeof(flag)) == -1 ){ perror("setsockopt error"); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(3389); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if ( bind( listen_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in)) == -1 ) { perror("bind error"); exit(1); } if ( listen( listen_fd,1 ) == -1 ){ perror("listen error"); exit(1); } for(;;){ int addr_len = sizeof( struct sockaddr_in ); accept_fd = accept( listen_fd, (struct sockaddr *)&remote_addr,&addr_len ); for(;;){ char in_buf[1024]; memset(in_buf, 0, 1024); recv( accept_fd ,&in_buf ,1024 ,0 ); printf( "accept:%s\n", in_buf ); } } return 0; }

Last modification:November 26th, 2018 at 04:16 pm
If you think my article is useful to you, please feel free to appreciate

One comment

  1. aydge.lee@gmail.com

    有意思你这叫非阻塞?
    接收一个以后就无限内循环了,永远接不到第二个。

Leave a Comment