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库...

posted @ 2013-06-03 20:15  ifeixiang  阅读(227)  评论(0编辑  收藏  举报