Socket编程(C语言实现)—— Nginx支持Socket转发
生活随笔
收集整理的這篇文章主要介紹了
Socket编程(C语言实现)—— Nginx支持Socket转发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
搭建Nginx環境: [root@localhost /]# cd /usr/local/src [root@localhost src]# wget http://nginx.org/download/nginx-1.11.10.tar.gz然后解壓,解壓完,根據文檔提示需要使用這個參數--with-stream 來啟用功能。[root@localhost src]# ./configure --prefix=/usr/local/nginx --with-stream 然后,make,make install。完成之后就是nginx配置配置文件啦,這個文檔中有示例,可知與events模塊平級,按照這做就好啦。worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events {worker_connections 1024; } stream{upstream abc{server 172.18.8.196:11911;}server{listen 11911;proxy_pass abc;} }ok,保存退出,重啟nginx使配置生效即可。到這里所有的操作就都完成啦,讓我們拭目以待,看下結果吧。 socket的服務端與客戶端可以通信實現服務端可以向客戶端發送信息,客戶端接受到信息后,顯示出來。用c#控制臺程序實現。服務端監聽本機ip與端口,服務端代碼如下:class Program{static Socket sck = null;static void Main(string[] args){ sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //監聽本機ip IPAddress ip = IPAddress.Parse("172.18.8.196"); IPEndPoint endPoint = new IPEndPoint(ip, int.Parse("11911")); sck.Bind(endPoint);sck.Listen(10);Console.WriteLine("開啟監聽!");Thread thread = new Thread(JtSocket);thread.IsBackground = true;thread.Start();while (true){ var msg = Console.ReadLine().Trim();if (msg != ""){byte[] buffer = System.Text.Encoding.ASCII.GetBytes(msg); //將要發送的數據,生成字節數組。accSck.Send(buffer);Console.WriteLine("向客戶端發送了:" + msg);}}}static Socket accSck = null; static void JtSocket(){while (true){ accSck = sck.Accept(); Console.WriteLine("鏈接成功!");}}}客戶端連接ip為nginx代理服務器ip,客戶端如下:class Program{static Socket clientSocket = null;static Thread thread = null;static void Main(string[] args){clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//這里聯通nginx代理服務器地址ipIPAddress ip = IPAddress.Parse("172.18.8.252");IPEndPoint endpoint = new IPEndPoint(ip, Convert.ToInt32("11911"));clientSocket.Connect(endpoint);thread = new Thread(ReceMsg);thread.IsBackground = true;thread.Start();Console.WriteLine("123");Console.ReadKey();}static void ReceMsg(){while (true){byte[] buffer = new byte[1024 * 1024 * 2];clientSocket.Receive(buffer);string ReceiveMsg = System.Text.Encoding.UTF8.GetString(buffer).Substring(0,30);Console.WriteLine("接收到數據:" + ReceiveMsg);}}}?
測試nginx轉發socket結果啟動服務端--->顯示:開啟監聽--->啟動客戶端----> 客戶端顯示:連接成功---->服務端輸入:abc----->服務端:點擊回車---->客戶端顯示:abc。如下服務端:客戶端:至此所有的都已整個過程都已結束,功能實現。工作中的遇到的問題:
server端:
?
client端:
#include "userSock.h"int user_socket_action(int argc , char **argv, char *pcName) {int sockfd;int tempfd;struct sockaddr_un s_addr_un;char data_send[BUFFER_LENGTH] = {0};char data_recv[BUFFER_LENGTH] = {0};sockfd = socket(AF_UNIX, SOCK_STREAM, 0);if(sockfd == -1){fprintf(stderr,"socket error!\n");exit(1);}s_addr_un.sun_family = AF_UNIX;memcpy(s_addr_un.sun_path, "/usr/local/nginx/conf/waf/sock_un", strlen("/usr/local/nginx/conf/waf/sock_un"));tempfd = connect(sockfd, (struct sockaddr *)&s_addr_un,sizeof(s_addr_un));//tempfd = connect(sockfd, "/usr/local/nginx/conf/waf/sock_un",0);if(tempfd == -1){fprintf(stderr,"Connect error!\n");close(sockfd);exit(1);}tempfd = write(sockfd,pcName,BUFFER_LENGTH);if(tempfd == -1){fprintf(stderr,"Write error!\n");close(sockfd);exit(1);}tempfd = read(sockfd,data_recv,BUFFER_LENGTH);assert(tempfd != -1);printf("%s\n",data_recv);memset(data_send,0,BUFFER_LENGTH);memset(data_recv,0,BUFFER_LENGTH);close(sockfd);return 0; }(*****還未經測試*****? 隨后再更新)
參考鏈接:https://m.linuxidc.com/Linux/2017-03/141318.htm&http:/m.linuxidc.com/Linux/2017-03/141318.htm
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Socket编程(C语言实现)—— Nginx支持Socket转发的全部內容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: Socket编程(C语言实现)——TCP
- 下一篇: 数据结构 —— 为结构体内变量赋值