服務端:
// select.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include #pragma comment(lib,"ws2_32.lib")
#define int_server_port 6002
#define str_server_ip "127.0.0.1"
#define int_databuffer_size 100
void main(void)
sockaddr_in addrserver;
memset(&addrserver,0,sizeof(sockaddr_in));
addrserver.sin_family = af_inet;
addrserver.sin_port = htons(int_server_port);
addrserver.sin_addr.s_un.s_addr = htonl(inaddr_any);
= htonl(inaddr_any);
int iresult;
bool breuseaddr=true;
iresult=setsockopt(sockserver,sol_socket,so_reuseaddr,(char *)&breuseaddr,sizeof(breuseaddr));
if(socket_error == iresult)
/* unsigned long cmd = 1;
iresult= ioctlsocket(sockserver,fionbio,&cmd); */
iresult = bind(sockserver,(sockaddr *)&addrserver,sizeof(addrserver));
if (socket_error == iresult)
if (0 != listen(sockserver,5))
uint i = 0;
socket sockaccept;
sockaddr_in addraccept;
int iacceptlen = sizeof(addraccept);
char szdatabuff[int_databuffer_size];
int irecvsize;
sockaddr_in addrtemp;
int itemplen;
fd_set fd;
fd_zero(&fd);
fd_set(sockserver,&fd);
/* timeval tm;
tm.tv_sec = 0;
tm.tv_usec = 1000;
*/ printf("start server.../r/n");
while(1)
}else //非伺服器,接收資料(因為fd是讀資料集)
if (0 == irecvsize)
if (0 < irecvsize)} }
}} else if (socket_error == iresult)
}wsacleanup();
}
客戶端
// select-client.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include #pragma comment(lib,"ws2_32.lib")
#define int_server_port 6002
#define str_server_ip "127.0.0.1"
#define int_databuffer_size 100
#define str_exit "exit"
void main(void)
sockaddr_in addrclient;
addrclient.sin_addr.s_un.s_addr = inet_addr(str_server_ip);
addrclient.sin_family = af_inet;
addrclient.sin_port = htons(int_server_port);
int iresult;
iresult = connect(sockclient,(sockaddr *)&addrclient,sizeof(sockaddr_in));
if (socket_error == iresult)
if (0 != iresult)
char szdatabuffer[int_databuffer_size];
while(1)
else
}sleep(100);
} closesocket(sockclient);
wsacleanup();
}
原理記錄:
1、首先拷貝乙份set, 使用select函式,沒有準備好的控制代碼會被刪除掉. 然後遍歷所有可用的控制代碼,並且處理。
2、 如果socket為伺服器的socket,則是鏈結命令,使用accept
3、recv收到0,網路關閉:closesocekt -1 出錯 0和-1都是網路斷開
4、soceket建立都可以抓包:syn、ack,push,fin 在wareshake的抓包中
select 函式使用方法
select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如 connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等 待某個事件的發生,...
List的 Select()使用方法 Demo
list的 select 使用方法 用list儲存物件,如下 iliststudentlist new list for int i 0 i 1000 i 現在需要從studentlist中查詢符合條件的物件,student中有個classname欄位,需要從studentlist中查詢classn...
linux中select使用方法
select系統呼叫是用來讓我們的程式監視多個檔案控制代碼 file descriptor 的狀態變化的。程式會停在select這裡等待,直到被監視的檔案控制代碼有某乙個或多個發生了狀態改變。檔案在控制代碼在linux裡很多,如果你man某個函式,在函式返回值部分說到成功後有乙個檔案控制代碼被建立的...