多路復用IO

2021-09-30 14:06:43 字數 3429 閱讀 7092

#ifndef _myhead_h_

#define _myhead_h_

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#define fd_setsize 15

#define myport 6667//1024以下的是保留的埠號,用大於1024的;

#define myaddr "192.168.1.102"

#endif

//伺服器

#include "myhead.h"

int connect_client[maxsize] = ;

int clientcnt = 0;

//只用來接受客戶端的連線,並且把客戶端的檔案描述符放置到connect_client陣列裡面;

void *handle_connect(void *argc)

;socklen_t len = sizeof(struct sockaddr);

while(1)

printf("accept success...client fd = %d\n",clientfd);

//2.當有客戶端來連線的時候,將客戶端的檔案描述符放到陣列裡面;

//connnet_clinet陣列一開始裡面的所有元素都是-1;

for(i = 0; i < maxsize; i++)}}

return null;

}void *handle_request(void *argc)

;fd_zero(&fdset);//把集合(池子)初始化;

while(1)}}

//2.用select進行監視;

ret = select(maxfd + 1,&fdset,null,null,&timeout);

//0代表超時;

if(ret == 0)

//-1代表有錯誤發生;

else if(ret == -1)

else

else if(recvcnt == 0)

else

if(strcmp(recvbuff,"end") == 0)}}

}}}return null;

}int main()

;  //變數型別儲存在netinet/in.h裡面的;

struct sockaddr_in sock_client = ;//儲存連線的客戶端那邊的資訊;

/*這行**很重要!*/

memset(connect_client,-1,sizeof(connect_client));

socklen_t len = sizeof(struct sockaddr);

//第一步:建立套接字;

socketfd = socket(af_inet,sock_stream,0);

if(socketfd == -1)

printf("socket success...\n");//確保前面的**是執行正確的;

int opt = 1;

//setsockopt(socketfd,sol_socket,so_reuseaddr,&opt,sizeof(opt));

//第二步:給套接字繫結必要的資訊;

sock_server.sin_family = af_inet;//給服務程式繫結位址族;

sock_server.sin_port = htons(myport);//給伺服器程式設定個埠號;

sock_server.sin_addr.s_addr = htonl(inaddr_any);//給服務程式繫結ip位址;

ret = bind(socketfd,(struct sockaddr *)&sock_server,sizeof(struct sockaddr));

if(ret == -1)

printf("bind success..\n");

ret = listen(socketfd,10);

if(ret == -1)

printf("listen success...\n");

pthread_t th1 = 0;

pthread_t th2 = 0;

/*建立執行緒處理客戶端連線*/

pthread_create(&th1,null,handle_connect,&socketfd);

/*建立執行緒處理客戶端的請求*/

pthread_create(&th2,null,handle_request,&socketfd);

pthread_join(th1,null);

pthread_join(th2,null);

close(socketfd);

return 0;}

//客戶機

#include "myhead.h"

static int socketfd;

void sig_handler(int sigo)

int main(int argc,char **ar**)

;if(argc != 2)

signal(sigint,sig_handler);

socketfd = socket(af_inet,sock_stream,0);

if(-1 == socketfd)

printf("socket success...\n");

//用sock_server提醒你們這邊連線的是伺服器端的ip位址和埠號;

sock_server.sin_family = af_inet;

sock_server.sin_port = htons(myport);

//sock_server.sin_addr.s_addr = inet_addr(myaddr);

sock_server.sin_addr.s_addr = inet_addr(ar**[1]);

printf("before connect...\n");

ret = connect(socketfd,(struct sockaddr *)&sock_server,sizeof(struct sockaddr));

printf("after connect...\n");

if(ret == -1)

printf("connect success...\n");

char sendbuff[20] = ;

int sendcnt = 0;

while(1)

else

//第三步:判斷傳送的資料是否是end,如果是,就結束;

if(strcmp(sendbuff,"end") == 0)

}return 0;

}

I O多路復用

一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...

i o多路復用

最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...

I O多路復用

我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...