linux socket编程
在想怎么将服务器端的程序与PHP交互的时候
- PHP扩展
- 进程端口:由于服务器程序执行的是大数据计算操作,耗时会比较长,使用php扩展可能会堵死PHP进程,所以决定采用这种方法
1 /* 2 * yf_deamon.cpp 3 * 4 * Created on: Jun 3, 2013 5 * Author: cloud 6 * 开启一个socket端口,进行本地进程通信 7 * 8 */ 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 13 #include <unistd.h> 14 #include <errno.h> 15 #include <sys/types.h> 16 #include <sys/socket.h> 17 #include <netinet/in.h> 18 #include <arpa/inet.h> 19 20 #define SERVER_PORT 9999 21 //监听队列长度 22 #define MAX_CONNECTIONS 10 23 #define MAX_MSG_LENGTH 4096 24 25 int main(int argc, char** argv) 26 { 27 //初始化socket连接 28 int server_sockfd ; //服务器端套接字 29 int client_sockfd; //客户端套接字 30 struct sockaddr_in server_addr ; 31 struct sockaddr_in remote_addr; //客户端网络地址结构体 32 char buffer[4096] ; 33 int len ; //数据长度 34 35 // 36 if( (server_sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1 ) 37 { 38 printf("create socket error : %s(errno:%d)\n",strerror(errno),errno); 39 exit(0); 40 } 41 42 memset(&server_addr , 0 , sizeof(server_addr)); 43 server_addr.sin_family = AF_INET ; 44 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 45 server_addr.sin_port = htons(SERVER_PORT); 46 47 //绑定端口 48 if( bind(server_sockfd,(struct sockaddr*)&server_addr, sizeof(server_addr)) == -1 ) 49 { 50 printf("bind socket error : %s(errno:%d)\n",strerror(errno),errno); 51 exit(0); 52 } 53 54 //监听端口 55 if( listen(server_sockfd , MAX_CONNECTIONS) == -1 ) 56 { 57 printf("listen socket error : %s(errno:%d)\n",strerror(errno),errno); 58 exit(0); 59 } 60 61 int sin_size=sizeof(struct sockaddr_in); 62 printf("waiting for client to connect...\n"); 63 //开始接收消息 64 while(1) 65 { 66 //死循环接收消息 67 if( ( client_sockfd = accept(server_sockfd,(struct sockaddr*)NULL,NULL) )== -1 ) 68 { 69 printf("accept socket error : %s(errno:%d)\n",strerror(errno),errno); 70 continue; 71 } 72 printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr)); 73 int len=send(client_sockfd,"Welcome to my server\n",21,0);//发送欢迎信息 74 75 len = recv(client_sockfd , buffer , MAX_MSG_LENGTH,0); 76 buffer[len] = '\0'; 77 printf("receive msg from client:%s\n",buffer); 78 79 //这里可以进行我们的程序处理 80 //作为例子,只是将数据再发回去 81 82 while(1) sleep(1000000); 83 if(send(client_sockfd,buffer,len,0)<0) 84 { 85 perror("write"); 86 return 1 ; 87 } 88 close(client_sockfd); 89 } 90 close(server_sockfd); 91 92 return 0 ; 93 94 }
当然,这里只是一个非常简单的例子程序,我们还需要加入epoll等异步IO库...