用select模式實現TCP和UDP的混合監聽

2021-06-21 08:28:39 字數 3545 閱讀 1967

// 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

else if(resultrand==1)

else

sleep(5000);}}

else}}

}//for( nloopi=0; nloopisocket  sudplisten;

socket  sclient;

sockaddr_in  addrlisten;

sockaddr_in  addrtcpclient;

sockaddr_in  addrudpclient;

int addrudpclientlen =sizeof(addrudpclient);

int addrtcpclientlen = sizeof(addrtcpclient);

printf(">>>>>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_nconnnumclosesocket( sudplisten );

wsacleanup();

return 0;

}

用select實現TCP回射程式(伺服器及客戶端)

該程式系參考 unp 來編寫的,主要用來練習select及shutdown函式的使用。伺服器 include include include include include include include include include include include define port 888...

用select實現點菜功能

bin bash echo a.txt ps3 請問您要吃什麼?echo 滿60元打八 dazhe do let sa n done echo 總計 sa元 if sa gt 60 then sa echo scale 4 sa 0.8 bc fiecho 折後 sa元 fenshu select ...

用select模組實現的socket server

之前筆記裡面記錄的比較亂,最後我寫了乙個類,試著封裝成乙個模組的樣子。使用的時候通過繼承生成乙個子類,然後呼叫run執行。你應該需要重構其中的部分方法,另外可能還需要在子類中建立新的方法。至少需要重構onrecv方法,接收到資料後的處理。另外要發資料,呼叫send data介面,把conn連線和by...