日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Socket编程(C语言实现)—— Nginx支持Socket转发

發布時間:2025/10/17 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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端:
?

/**************************************************************** 簡述:線程執行函數,創建socket并監聽,對用戶管理提供支持 參數:void *pvData 返回值:NULL 備注:無 *****************************************************************/ #define NGX_HTTP_MYACCESS_SOCK_PATH_STR "/usr/local/nginx/conf/waf/sock_un" #define NGX_HTTP_MYACCESS_SOCK_QUEUESIZE 1024UL #define NGX_HTTP_MYACCESS_EPOLL_LISTEN_NUM 10240UL #define NGX_HTTP_MYACCESS_EPOLLEVENT_MAXNUM 1024UL #define EPOLLIN 0x001 #define NGX_OK 0 #define EPOLL_CTL_ADD 1 #define EPOLL_CTL_DEL 2 static void * _ngx_http_myaccess_thread_run(void *pvData) {int i = 0;int iTmpFd = 0;int iRetNum = 0;int iSockFd = 0;int iEpollFd = 0;mode_t mod = {0};socklen_t iAddrLen = 0;struct sockaddr_un stAddr = {0};struct epoll_event stListen_Event = {0};struct epoll_event astEpollEvent[NGX_HTTP_MYACCESS_EPOLLEVENT_MAXNUM] = {{0}};/* 刪除原來的socket文件 */remove(NGX_HTTP_MYACCESS_SOCK_PATH_STR);/* 設置umask,使創建的sock文件的權限為0777 */mod = umask(0);/* 創建socket */iSockFd = socket(AF_UNIX, SOCK_STREAM, 0);if(0 > iSockFd){return NULL;}/* 綁定 */stAddr.sun_family = AF_UNIX;ngx_memcpy(stAddr.sun_path, NGX_HTTP_MYACCESS_SOCK_PATH_STR, sizeof(stAddr.sun_path));if(0 > bind(iSockFd, (void *)&stAddr, sizeof(stAddr))){close(iSockFd);return NULL;}/* 恢復原有的umask umask:設置限制新文件權限*/umask(mod);/* 監聽 */if(0 >listen(iSockFd, NGX_HTTP_MYACCESS_SOCK_QUEUESIZE)){close(iSockFd);return NULL;}/* 創建EPOLL監聽 */iEpollFd = epoll_create(NGX_HTTP_MYACCESS_EPOLL_LISTEN_NUM);if(0 > iEpollFd){close(iSockFd);return NULL;}/* 將socket加入epoll監聽列表 */stListen_Event.data.fd = iSockFd;stListen_Event.events = EPOLLIN;if(0 > epoll_ctl(iEpollFd, EPOLL_CTL_ADD, iSockFd, &stListen_Event)){close(iSockFd);close(iEpollFd);return NULL;}while(1){iRetNum = epoll_wait(iEpollFd, astEpollEvent, NGX_HTTP_MYACCESS_EPOLLEVENT_MAXNUM, -1);for(i = 0; i < iRetNum; i++){if(iSockFd == astEpollEvent[i].data.fd){/* 接受新的連接 */iAddrLen = sizeof(stAddr);iTmpFd = accept(iSockFd, (void *)&stAddr, &iAddrLen);/* 將新的連接加入到epoll的監聽列表中 */stListen_Event.data.fd = iTmpFd;stListen_Event.events = EPOLLIN;if(0 > epoll_ctl(iEpollFd, EPOLL_CTL_ADD, iTmpFd, &stListen_Event)){close(iTmpFd);continue;}}else if(EPOLLIN == astEpollEvent[i].events){/* 處理用戶輸入,若返回失敗,清除監聽關閉鏈接 */if(NGX_OK != _ngx_http_myaccess_EpollIn(astEpollEvent[i].data.fd, g_pstOnLineHashTb)){epoll_ctl(iEpollFd, EPOLL_CTL_DEL, astEpollEvent[i].data.fd, &astEpollEvent[i]);close(astEpollEvent[i].data.fd);}}else{epoll_ctl(iEpollFd, EPOLL_CTL_DEL, astEpollEvent[i].data.fd, &astEpollEvent[i]);close(astEpollEvent[i].data.fd);}}}close(iSockFd);return NULL; }

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转发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。