TCP服務和UDP服務的同時處理

2021-09-22 19:49:50 字數 2202 閱讀 4486

在實際的生產環境中,我們的服務程式往往需要同時監聽多個埠,從bind系統呼叫的引數我們知道,乙個socket只能與乙個socket位址相繫結,即乙個socket只能用來監聽乙個埠。因此要監聽多個埠就需要建立多個socket,並將它們分別繫結多個埠,通過io復用進行監聽多個socket.

通過剛才的介紹我們可以知道,即使是同乙個埠,如果伺服器要同時監聽tcp和udp請求,則也需要建立兩個不同的socket:乙個流socket,乙個資料報socket,並將他們繫結到同乙個埠上,新增到我們io多路復用要監控的集合中。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define max_event_number 1024

#define tcp_buffer_size 512

#define udp_buffer_size 1024

int setnonblocking(int fd)

void addfd(int epollfd,int fd)

int main(int argc,char** ar**)

const char* ip = ar**[1];

int port = atoi(ar**[2]);

int ret = 0;

struct sockaddr_in address;

bzero(&address,sizeof(address));

address.sin_family = af_inet;

inet_pton(af_inet,ip,&address.sin_addr.s_addr);

address.sin_port = htons(port);

//建立tcpsocket將其繫結在埠port上

int listenfd = socket(pf_inet,sock_stream,0);

assert(listenfd >= 0);

ret = bind(listenfd,(struct sockaddr*)&address,sizeof(address));

assert(ret >= 0);

ret = listen(listenfd,5);

assert(ret != -1);

//建立udpsocket將其繫結到埠port上

bzero(&address,sizeof(address));

address.sin_family = af_inet;

inet_pton(af_inet,ip,&address.sin_addr.s_addr);

address.sin_port = htons(port);

int udpfd = socket(pf_inet,sock_dgram,0);

assert(udpfd >= 0);

ret = bind(udpfd,(struct sockaddr*)&address,sizeof(address));

assert(ret != -1);

epoll_event events[max_event_number];

int epollfd = epoll_create(5);

assert(epollfd != -1);

//註冊tcp socket和udp socket上的可讀可寫事件

addfd(epollfd,listenfd);

addfd(epollfd,udpfd);

while(1)

for(int i = 0;i < number;i++)

else if(sockfd == udpfd)

{char buf[udp_buffer_size];

memset(buf,'\0',udp_buffer_size);

struct sockaddr_in client_address;

socklen_t client_addrlength = sizeof(client_address);

ret = recvfrom(udpfd,buf,udp_buffer_size-1,0,(struct sockaddr*)&client_address,&client_addrlength);

if(ret > 0)

{std::cout<<"a udp message"<

python實現TCP和UDP伺服器

import socket updsocket socket.socket socket.af inet,socket.sock dgram updsocket.sendto helloworld encode utf 8 172.20.52.75 3333 updsocket.close impo...

TCP以及UDP服務端和客戶端

tcp server.py from datetime import datetime import socket address localhost 6789 max size 1000 print starting the server at datetime.now print waiting...

Print Spooler服務解析和故障處理

print spooler服務描述 管理所有本地和網路列印佇列及控制所有列印工作。如果此服務被停用,本地計算機上的列印將不可用。如果此服務被禁用,任何依賴於它的服務將無法啟用。可執行檔案路徑 c windows system32 spoolsv.exe spooler 列印後台處理服務 的程序名是s...