socket程式設計select實現併發處理

2021-08-28 10:05:37 字數 2765 閱讀 9017

//伺服器客戶端均已修改

//伺服器

#include #include #include #include #include #include //使用signal函式

#include //使用wait函式

#include #include #include #include #define err_exit(m) \

do \

while(0)

//讀確定大小的包

//ssize_t有符號數,size_t為無符號數

ssize_t readn(int fd, void *buf, size_t count)

return -1;//否則出錯

} else if(nread==0)//表示對方關閉傳送

bufp+=nread;//進行指標偏移

nleft -= nread;

} return count;

}ssize_t writen(int fd, const void *buf, size_t count)

return -1;//否則出錯

} else if(nwritten==0)

bufp+=nwritten;//進行指標偏移

nleft -= nwritten;

} return count;

}ssize_t recv_peek(int sockfd, void *buf,size_t len)

}ssize_t readline(int sockfd, void *buf, size_t maxline)

else if(ret=0)

nread=ret;

int i;//檢測有沒有『\n』字元,有則讀取

for(i=0; i0)

}int main(void)

else

close(conn);

} */

int i;

int maxi = 0;

int client[fd_setsize];

for(i=0; imaxi)

maxi=i;

break;}}

if(i==fd_setsize)

printf("ip=%s port=%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));

fd_set(conn, &allset);

if(conn>maxfd)

maxfd = conn;

if(--nready<=0)

continue;

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

;int ret = readline(conn, recvbuf,1024);//先接受包頭

if(ret==-1)//讀取失敗則退出

err_exit("readline");

else if(ret==0)//客戶端關閉

fputs(recvbuf,stdout);//列印標準輸出

writen(conn,recvbuf, strlen(recvbuf));

if(--nready<=0)

break;}}

} return 0;

}#include #include #include #include #include #include #include #include #include #define err_exit(m) \

do \

while(0)

//讀確定大小的包

//ssize_t有符號數,size_t為無符號數

ssize_t readn(int fd, void *buf, size_t count)

return -1;//否則出錯

} else if(nread==0)//表示對方關閉傳送

bufp+=nread;//進行指標偏移

nleft -= nread;

} return count;

}ssize_t writen(int fd, const void *buf, size_t count)

return -1;//否則出錯

} else if(nwritten==0)

bufp+=nwritten;//進行指標偏移

nleft -= nwritten;

} return count;

}ssize_t recv_peek(int sockfd, void *buf,size_t len)

}ssize_t readline(int sockfd, void *buf, size_t maxline)

else if(ret=0)

nread=ret;

int i;

for(i=0; isock)

maxfd =fd_stdin;

else

maxfd = sock;

while(1)

fputs(recvbuf,stdout);//列印標準輸出

//memset(&sendbuf,0, sizeof(sendbuf));//該段只執行接受伺服器資料

memset(&recvbuf, 0, sizeof(recvbuf));

} if(fd_isset(fd_stdin, &rset))

} close(sock);

}int main(void)

ehco_cli(sock);

return 0;

}

Socket程式設計之Select

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...

socket程式設計之select

linux程式設計之select select作用是 在一段指定的時間內,監聽使用者感興趣的檔案描述符上可讀 可寫和異常等事件。1 socket阻塞模式 通常在socket程式設計中,我們習慣於寫connect accept recv recvfrom這樣的阻塞程式。如果事件不發生,程式就一直阻塞在...

socket 使用select 非阻塞方式實現

select函式原型如下 int select int maxfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout select系統呼叫是用來讓我們的程式監視多個檔案控制代碼 socket 控制代碼 的狀...