非阻塞socket學習,select基本用法

2021-09-07 05:25:10 字數 2622 閱讀 3853

server

#include #include 

#include

#pragma comment(lib, "ws2_32.lib")

#define port 9999

#define data_bufsize 8192typedef

struct

_socket_information socket_infomation, *lpsocket_information;

dword totalsockets = 0

;lpsocket_information socketarray[fd_setsize];

bool

createsocketinformation(socket s)

//初始化si的值

si->socket =s;

si->bytessend = 0

; si->bytesrecv = 0

; socketarray[totalsockets] =si;

totalsockets++;

return

true;}

void

freesocketinformation(dword index)

}totalsockets--;

}int

main()

//建立用於監聽的套接字

//設定監聽位址和埠

internetaddr.sin_family =af_inet;

internetaddr.sin_addr.s_un.s_addr =htonl(inaddr_any);

internetaddr.sin_port =htons(port);

//繫結監聽套接字到本地位址和埠

if (bind(listensocket, (psockaddr)&internetaddr, sizeof internetaddr) ==invalid_socket)

//開始監聽

if (listen(listensocket, 5

))

//設定成非阻塞方式

ulong nonblock = 1

;

if (ioctlsocket(listensocket, fionbio, &nonblock))

createsocketinformation(listensocket);

//listensocket套接字建立對應的socket_information,把listensocket新增到socketarray陣列中

while (true

)

if((total = select(0, &readset, &writeset, null, null)) == socket_error)

for (dword i = 0; i < totalsockets; i++)

if (createsocketinformation(acceptsocket) == false)//

將acceptsocket新增到socketarray陣列中

}else}}

else

//接收資料

continue

; }

else

else}}

}else

continue

; }

else}}

}}}}

system(

"pause");

return0;

}

client

#include #include 

#define bufsize 64

#define port 9999

#pragma comment(lib, "ws2_32.lib")

intmain()

sclient =socket(af_inet, sock_stream, ipproto_tcp);

if (invalid_socket ==sclient)

addrserv.sin_family =af_inet;

addrserv.sin_port =htons(port);

addrserv.sin_addr.s_un.s_addr = inet_addr("

127.0.0.1");

retval = connect(sclient, (lpsockaddr)&addrserv, sizeof

(addrserv));

if (socket_error ==retval)

while(true

)

retval = recv(sclient, buf, sizeof buf, 0

); std::cout

<< "

從伺服器端接收:

"<< buf

quit

") == 0

)

}closesocket(sclient);

wsacleanup();

return0;

}

socket阻塞與非阻塞

何為阻塞?在以上過程中若連線還沒到來,那麼接受阻塞,程式執行到這裡不得不掛起,cpu轉而執行其他執行緒。在以上過程中若資料還沒準備好,請閱讀會一樣也會阻塞。阻塞式網路io的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些cpu時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...

轉阻塞socket和非阻塞socket

讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...

非阻塞socket程式設計

socket程式設計中可能出現阻塞的呼叫有4個 1.write send sendto sendmsg sendv等,如果某個程序呼叫乙個阻塞的tcp套接字 預設設定 如果傳送緩衝區沒有空間,呼叫程序將會睡眠,直到有空間為止。如果tcp套接字是非阻塞的,且沒有空間可寫,則會返回乙個ewouleblo...