日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Nginx >内容正文

Nginx

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

發(fā)布時(shí)間:2025/10/17 Nginx 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Socket编程(C语言实现)—— Nginx支持Socket转发 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

搭建Nginx環(huán)境: [root@localhost /]# cd /usr/local/src [root@localhost src]# wget http://nginx.org/download/nginx-1.11.10.tar.gz然后解壓,解壓完,根據(jù)文檔提示需要使用這個(gè)參數(shù)--with-stream 來(lái)啟用功能。[root@localhost src]# ./configure --prefix=/usr/local/nginx --with-stream 然后,make,make install。完成之后就是nginx配置配置文件啦,這個(gè)文檔中有示例,可知與events模塊平級(jí),按照這做就好啦。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使配置生效即可。到這里所有的操作就都完成啦,讓我們拭目以待,看下結(jié)果吧。 socket的服務(wù)端與客戶(hù)端可以通信實(shí)現(xiàn)服務(wù)端可以向客戶(hù)端發(fā)送信息,客戶(hù)端接受到信息后,顯示出來(lái)。用c#控制臺(tái)程序?qū)崿F(xiàn)。服務(wù)端監(jiān)聽(tīng)本機(jī)ip與端口,服務(wù)端代碼如下:class Program{static Socket sck = null;static void Main(string[] args){ sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //監(jiān)聽(tīng)本機(jī)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("開(kāi)啟監(jiān)聽(tīng)!");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); //將要發(fā)送的數(shù)據(jù),生成字節(jié)數(shù)組。accSck.Send(buffer);Console.WriteLine("向客戶(hù)端發(fā)送了:" + msg);}}}static Socket accSck = null; static void JtSocket(){while (true){ accSck = sck.Accept(); Console.WriteLine("鏈接成功!");}}}客戶(hù)端連接ip為nginx代理服務(wù)器ip,客戶(hù)端如下:class Program{static Socket clientSocket = null;static Thread thread = null;static void Main(string[] args){clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//這里聯(lián)通nginx代理服務(wù)器地址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("接收到數(shù)據(jù):" + ReceiveMsg);}}}

?

測(cè)試nginx轉(zhuǎn)發(fā)socket結(jié)果啟動(dòng)服務(wù)端--->顯示:開(kāi)啟監(jiān)聽(tīng)--->啟動(dòng)客戶(hù)端----> 客戶(hù)端顯示:連接成功---->服務(wù)端輸入:abc----->服務(wù)端:點(diǎn)擊回車(chē)---->客戶(hù)端顯示:abc。如下服務(wù)端:客戶(hù)端:至此所有的都已整個(gè)過(guò)程都已結(jié)束,功能實(shí)現(xiàn)。

工作中的遇到的問(wèn)題:
server端:
?

/**************************************************************** 簡(jiǎn)述:線程執(zhí)行函數(shù),創(chuàng)建socket并監(jiān)聽(tīng),對(duì)用戶(hù)管理提供支持 參數(shù):void *pvData 返回值:NULL 備注:無(wú) *****************************************************************/ #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}};/* 刪除原來(lái)的socket文件 */remove(NGX_HTTP_MYACCESS_SOCK_PATH_STR);/* 設(shè)置umask,使創(chuàng)建的sock文件的權(quán)限為0777 */mod = umask(0);/* 創(chuàng)建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;}/* 恢復(fù)原有的umask umask:設(shè)置限制新文件權(quán)限*/umask(mod);/* 監(jiān)聽(tīng) */if(0 >listen(iSockFd, NGX_HTTP_MYACCESS_SOCK_QUEUESIZE)){close(iSockFd);return NULL;}/* 創(chuàng)建EPOLL監(jiān)聽(tīng) */iEpollFd = epoll_create(NGX_HTTP_MYACCESS_EPOLL_LISTEN_NUM);if(0 > iEpollFd){close(iSockFd);return NULL;}/* 將socket加入epoll監(jiān)聽(tīng)列表 */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的監(jiān)聽(tīng)列表中 */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){/* 處理用戶(hù)輸入,若返回失敗,清除監(jiān)聽(tīng)關(guān)閉鏈接 */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; }

(*****還未經(jīng)測(cè)試*****? 隨后再更新)

參考鏈接:https://m.linuxidc.com/Linux/2017-03/141318.htm&http:/m.linuxidc.com/Linux/2017-03/141318.htm

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Socket编程(C语言实现)—— Nginx支持Socket转发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。