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

  • 相关阅读:
    linux上安装mysql
    Linux上安装elasticsearch
    解决pyhton aiohttp ssl:None [[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
    mysql数据库的数据变更事件获取以及相关数据
    [天下小黑盒]打地鼠小助手
    看到当年自己学SQL Server 的笔记
    CodeFirst EF中导航属性的个人理解
    在Win10下如何安装IMSL6.0
    商品中台三期压测
    压测
  • 原文地址:https://www.cnblogs.com/trying/p/3116025.html
Copyright © 2020-2023  润新知