基於Select模型的UDP TCP混合程式設計

2021-09-25 13:01:38 字數 3567 閱讀 3402

**: 

// selecttestserver.cpp : 定義控制台應用程式的入口點。

////   tcp udp復用server select非阻塞模式

//   ip: 127.0.0.1

//   tcp port: 5001

//   udp port: 5000

#include "stdafx.h"

#include  

#pragma  comment ( lib, "ws2_32" )

#define listen_ip    "127.0.0.1"

#define listen_tcp_port 5001            //tcp監聽埠

#define listen_udp_port 5000            //udp監聽埠

#define default_buff 256

#define max_listen   5    //最多可同時連線的客戶端數量

int g_fd_arrayc[max_listen] = ; //處理所有的待決連線

char recvbuff[default_buff] = "\0";

char responsebuff[default_buff] = "\0";

char noresponsebuff[default_buff] = ;

int g_nres = 0;

int g_nconnnum = 0;//當前的客戶端連線數

void clientsocketadd(fd_set far * set)        //將伺服器接收到的客戶端socket新增到select監聽中

else if(resultrand==1)

else

sleep(5000);}}

else}} 

}//for( nloopi=0; nloopi>>>>tcp 伺服器端啟動<<<<<<\n");

wsastartup(makeword(2,2), &wsdata);

//----------------------------------

//建立乙個socket的tcp伺服器監聽埠

printf("-建立乙個tcp socket\n");

stcplisten = socket( af_inet, sock_stream, ipproto_tcp );

if(stcplisten==invalid_socket)

printf("-設定tcp伺服器監聽埠\n");

addrlisten.sin_family = af_inet;

addrlisten.sin_addr.s_un.s_addr = inet_addr(listen_ip);

addrlisten.sin_port = htons( listen_tcp_port );

printf("-繫結socket與指定監聽埠: %s:%d\n", inet_ntoa(addrlisten.sin_addr), ntohs(addrlisten.sin_port));

g_nres = bind( stcplisten, (const sockaddr*)&addrlisten, sizeof(addrlisten) );

if( g_nres == socket_error )

printf("-監聽埠\n");

g_nres = listen( stcplisten, max_listen );

if( g_nres == socket_error )

//----------------------------------

//建立乙個socket的udp伺服器監聽埠

printf("-建立乙個udp socket\n");

sudplisten = socket( af_inet, sock_dgram, 0);

if(sudplisten==invalid_socket)

printf("-設定udp伺服器監聽埠\n");

addrlisten.sin_family = af_inet;

addrlisten.sin_addr.s_un.s_addr = inet_addr(listen_ip);;

addrlisten.sin_port = htons( listen_udp_port );

printf("-繫結socket與指定監聽埠: %s:%d\n", inet_ntoa(addrlisten.sin_addr), ntohs(addrlisten.sin_port));

g_nres = bind( sudplisten, (const sockaddr*)&addrlisten, sizeof(addrlisten) );

if( g_nres == socket_error )

/// 非阻塞模式設定tcp

/dword nmode = 1;

g_nres = ioctlsocket( stcplisten, fionbio, &nmode );

if( g_nres == socket_error )

/// 非阻塞模式設定udp

/nmode = 1;

g_nres = ioctlsocket( sudplisten, fionbio, &nmode );

if( g_nres == socket_error )

printf("-設定伺服器端模式: %s\n", nmode==0? "阻塞模式":"非阻塞模式");

printf("-開始準備接受連線\n");

fd_set fdread;

//fd_set fdwrite;

timeval tv=; //設定select每次的輪詢時間

int   nloopi = 0;

while(true)

else if( g_nres < 0 )

/* 檢查所有的可用socket*/

checkactivesocket(&fdread);

//檢查udp socket連線

if(fd_isset( sudplisten, &fdread))

else }

}//檢查是否為新的連線進入

if( fd_isset( stcplisten, &fdread) )

else if( sclient == invalid_socket )

//新的連線可以使用,檢視待決處理佇列

if( g_nconnnum}++g_nconnnum;

printf("-新的客戶端資訊:[%d] %s:%d\n", sclient, inet_ntoa(addrtcpclient.sin_addr), ntohs(addrtcpclient.sin_port));

}else

}//if( fd_isset( stcplisten, &fdread) )

}//while(true)

printf("-關閉伺服器端socket\n");

closesocket( stcplisten );

closesocket( sudplisten );

wsacleanup();

return 0;

}

基於select模型的server

前面一篇介紹了io模型。其中重點介紹了io多路轉接中的三種模型,包括了select,poll,epoll三種。下面就是基於select模型編寫的伺服器與客戶機,兩者可以進行互動。伺服器端 k include include include include include include includ...

基於事件套接字集合的select 模型

基於事件套接字集合的select 模型 select 選擇 模型是winsock 中最常見的i o 模型。之所以稱其為 select 模型 是由於它的 中心思想 便是利用select 函式,實現對i o 的管理!最初設計該模型時,主要面向的是某些使用unix 作業系統的計算機,它們採用的是berke...

基於select模型的udp客戶端實現超時機制

參考 多路選擇i o select模型 其思想在於使用乙個集合,該集合中包含需要進行讀寫的fd,通過輪詢這個集合,直到有乙個fd可讀寫,才返回。與阻塞i o不同的是,阻塞i o僅使用了一次系統呼叫,就是對fd的讀寫,如果沒有fd處於就緒狀態,則程序一直阻塞,而多路選擇i o使用了兩次系統呼叫,第一次...