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