select的使用方法記錄

2021-06-22 15:53:58 字數 2713 閱讀 7987

服務端:

// 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某個函式,在函式返回值部分說到成功後有乙個檔案控制代碼被建立的...