LINUX 并发服务器 fork
来源:互联网 发布:今日股市数据 编辑:程序博客网 时间:2024/05/19 03:16
/*****************************************************************************
File name: tcp_server_fork
Description: tcp服务端,可接受来自100个客户端的连接请求,每个客户端会创建一
个进程,在主函数中创建了两个socket,一个用于接收,另一个用于发
送
Author: 作者
Version: 版本
Date: 2012.2.22
Input: 服务器向客户端发送的数据 send
存储客户端发来的数据指针 recv
Output: 无
History:
*****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MY_PORT_RECV 3333 //服务器接收端口
#define MY_PORT_SEND 4444 //服务器发送端口
void tcp_server(char *recv,char *send)
{
int listen_fd1,accept_fd1,listen_fd2,accept_fd2;
struct sockaddr_in client_addr1,server_addr1,client_addr2,server_addr2;
int n;
int nbytes;
int sin_size;
/*创建 scoket1 用于接收客户端信息*/
if((listen_fd1=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("Socket Error:%s\n\a",strerror(errno));
exit(1);
}
/*填充server1的 ip 端口 协议类型用于接收*/
bzero(&server_addr1,sizeof(struct sockaddr_in));
bzero(&server_addr2,sizeof(struct sockaddr_in));
server_addr1.sin_family=AF_INET;
server_addr1.sin_port=htons(MY_PORT_RECV);
server_addr1.sin_addr.s_addr=htonl(INADDR_ANY);
n=1;
/* 如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间 */
setsockopt(listen_fd1,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
/*将server1的信息绑定到socket1的描述符*/
if(bind(listen_fd1,(struct sockaddr *)&server_addr1,sizeof(server_addr1))<0)
{
printf("Bind Error:%s\n\a",strerror(errno));
exit(1);
}
/*监听*/
listen(listen_fd1,100);
/*创建 scoket1 用于向客户端发送信息*/
if((listen_fd2=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("Socket Error:%s\n\a",strerror(errno));
exit(1);
}
/*填充server2的 ip 端口 协议类型用于发送*/
server_addr2.sin_family=AF_INET;
server_addr2.sin_port=htons(MY_PORT_SEND);
server_addr2.sin_addr.s_addr=htonl(INADDR_ANY);
/* 如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间 */
setsockopt(listen_fd2,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
/*将server2的信息绑定到socket2的描述符*/
if(bind(listen_fd2,(struct sockaddr *)&server_addr2,sizeof(server_addr2))<0)
{
printf("Bind Error:%s\n\a",strerror(errno));
exit(1);
}
/*监听*/
listen(listen_fd2,100);
while(1)
{
/*等待客户端的连接,accept函数阻塞*/
accept_fd1=accept(listen_fd1,(struct sockaddr *)(&client_addr1),&sin_size);
if((accept_fd1<0)&&(errno==EINTR))
continue;
else if(accept_fd1<0)
{
printf("Accept Error:%s\n\a",strerror(errno));
continue;
}
/*创建子进程 来处理客户端连接接收信息*/
if((n=fork())==0)
{
char str_recv[1024];
/*读取来自客户端的数据*/
if((nbytes=read(accept_fd1,str_recv,1024))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
str_recv[nbytes]='\0';
recv=str_recv;
/*打印出客户端IP*/
fprintf(stderr,"Server get connection (recv) from %s\n",inet_ntoa(client_addr1.sin_addr));
/*打印出接收到的字符串*/
printf("Server received %s\n",str_recv);
/*关闭socket*/
close(accept_fd1);
/*退出子进程*/
exit(0);
}
/*等待来自4444端口的连接*/
accept_fd2=accept(listen_fd2,(struct sockaddr *)(&client_addr2),&sin_size);
if((accept_fd2<0)&&(errno==EINTR)) //阻塞在此
continue;
else if(accept_fd2<0)
{
printf("Accept Error:%s\n\a",strerror(errno));
continue;
}
/*创建子进程用于发送数据到客户端*/
if((n=fork())==0)
{
char *str_send=send;
/*打印出客户端IP*/
printf("Server get connection (send) from %s\n",inet_ntoa(client_addr2.sin_addr));
/*发送信息*/
write(accept_fd2,str_send,strlen(str_send));
printf("send to client :%s\n",str_send);
}
//close(accept_fd);
}
}
int main(void)
{
char *str1="hello";
char *str2;
str2=(char *)malloc(1024);
tcp_server(str2,str1);
}
File name: tcp_server_fork
Description: tcp服务端,可接受来自100个客户端的连接请求,每个客户端会创建一
个进程,在主函数中创建了两个socket,一个用于接收,另一个用于发
送
Author: 作者
Version: 版本
Date: 2012.2.22
Input: 服务器向客户端发送的数据 send
存储客户端发来的数据指针 recv
Output: 无
History:
*****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MY_PORT_RECV 3333 //服务器接收端口
#define MY_PORT_SEND 4444 //服务器发送端口
void tcp_server(char *recv,char *send)
{
int listen_fd1,accept_fd1,listen_fd2,accept_fd2;
struct sockaddr_in client_addr1,server_addr1,client_addr2,server_addr2;
int n;
int nbytes;
int sin_size;
/*创建 scoket1 用于接收客户端信息*/
if((listen_fd1=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("Socket Error:%s\n\a",strerror(errno));
exit(1);
}
/*填充server1的 ip 端口 协议类型用于接收*/
bzero(&server_addr1,sizeof(struct sockaddr_in));
bzero(&server_addr2,sizeof(struct sockaddr_in));
server_addr1.sin_family=AF_INET;
server_addr1.sin_port=htons(MY_PORT_RECV);
server_addr1.sin_addr.s_addr=htonl(INADDR_ANY);
n=1;
/* 如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间 */
setsockopt(listen_fd1,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
/*将server1的信息绑定到socket1的描述符*/
if(bind(listen_fd1,(struct sockaddr *)&server_addr1,sizeof(server_addr1))<0)
{
printf("Bind Error:%s\n\a",strerror(errno));
exit(1);
}
/*监听*/
listen(listen_fd1,100);
/*创建 scoket1 用于向客户端发送信息*/
if((listen_fd2=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("Socket Error:%s\n\a",strerror(errno));
exit(1);
}
/*填充server2的 ip 端口 协议类型用于发送*/
server_addr2.sin_family=AF_INET;
server_addr2.sin_port=htons(MY_PORT_SEND);
server_addr2.sin_addr.s_addr=htonl(INADDR_ANY);
/* 如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间 */
setsockopt(listen_fd2,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
/*将server2的信息绑定到socket2的描述符*/
if(bind(listen_fd2,(struct sockaddr *)&server_addr2,sizeof(server_addr2))<0)
{
printf("Bind Error:%s\n\a",strerror(errno));
exit(1);
}
/*监听*/
listen(listen_fd2,100);
while(1)
{
/*等待客户端的连接,accept函数阻塞*/
accept_fd1=accept(listen_fd1,(struct sockaddr *)(&client_addr1),&sin_size);
if((accept_fd1<0)&&(errno==EINTR))
continue;
else if(accept_fd1<0)
{
printf("Accept Error:%s\n\a",strerror(errno));
continue;
}
/*创建子进程 来处理客户端连接接收信息*/
if((n=fork())==0)
{
char str_recv[1024];
/*读取来自客户端的数据*/
if((nbytes=read(accept_fd1,str_recv,1024))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
str_recv[nbytes]='\0';
recv=str_recv;
/*打印出客户端IP*/
fprintf(stderr,"Server get connection (recv) from %s\n",inet_ntoa(client_addr1.sin_addr));
/*打印出接收到的字符串*/
printf("Server received %s\n",str_recv);
/*关闭socket*/
close(accept_fd1);
/*退出子进程*/
exit(0);
}
/*等待来自4444端口的连接*/
accept_fd2=accept(listen_fd2,(struct sockaddr *)(&client_addr2),&sin_size);
if((accept_fd2<0)&&(errno==EINTR)) //阻塞在此
continue;
else if(accept_fd2<0)
{
printf("Accept Error:%s\n\a",strerror(errno));
continue;
}
/*创建子进程用于发送数据到客户端*/
if((n=fork())==0)
{
char *str_send=send;
/*打印出客户端IP*/
printf("Server get connection (send) from %s\n",inet_ntoa(client_addr2.sin_addr));
/*发送信息*/
write(accept_fd2,str_send,strlen(str_send));
printf("send to client :%s\n",str_send);
}
//close(accept_fd);
}
}
int main(void)
{
char *str1="hello";
char *str2;
str2=(char *)malloc(1024);
tcp_server(str2,str1);
}
- LINUX 并发服务器 fork
- fork并发服务器
- Linux socket通信——并发服务器(fork)
- linux网络编程fork并发处理的服务器
- linux(一)------多进程并发服务器实现(fork)
- 聊聊Linux fork多进程并发服务器模型
- fork()理解及简单并发服务器应用
- fork()理解及简单并发服务器应用
- linux fork多进程并发服务器模型之C/C++代码实战
- 【linux】fork() && fork() || fork()
- linux并发服务器
- linux 并发服务器
- linux 并发服务器模式
- Linux并发服务器实现
- linux 并发服务器 demo
- linux服务器进程为何通常fork()两次
- linux并发端口扫描以及fork()函数的用法;
- Linux并发服务器代码实现
- java例程练习(对象转型及instanceof关键字)
- 串口调试GPRS模块
- 黑马程序员—winform和数据库的学习感悟
- mini2440串口控制GPRS模块程序
- struts2 <s:iterator>奇偶行不同颜色
- LINUX 并发服务器 fork
- linux多线程socket客户端
- kilu.de德国免费空间中文乱码解决方法
- Java类7大基本设计潜规则 ——潜规则在于你可以不遵守,但一定要付出代价
- Android 4.0 开机启动后接受不到android.permission.RECEIVE_BOOT_COMPLETED 广播
- jdk与jre的区别
- 用cocos2d-x做一个简单的windows phone 7游戏:更猛的怪兽和更多的关卡(三)
- ORA-22285: 对不存在的目录或文件进行 FILEOPEN 操作 ORA-06512: 在 "SYS.DBMS_LOB", line 523 ORA-06512: 在 line 6 查看错误堆
- c语言夜未眠2——实现撤销和重做