锘??xml version="1.0" encoding="utf-8" standalone="yes"?>午夜电影一区,岳的好大精品一区二区三区,在线国产网址http://www.aygfsteel.com/steven-ma/zh-cnWed, 18 Jun 2025 01:07:18 GMTWed, 18 Jun 2025 01:07:18 GMT60Socket宸ヤ綔妯″紡http://www.aygfsteel.com/steven-ma/archive/2006/04/13/40823.htmlsteven's homesteven's homeThu, 13 Apr 2006 02:29:00 GMThttp://www.aygfsteel.com/steven-ma/archive/2006/04/13/40823.htmlhttp://www.aygfsteel.com/steven-ma/comments/40823.htmlhttp://www.aygfsteel.com/steven-ma/archive/2006/04/13/40823.html#Feedback0http://www.aygfsteel.com/steven-ma/comments/commentRss/40823.htmlhttp://www.aygfsteel.com/steven-ma/services/trackbacks/40823.htmlhttp://www.aka.org.cn/Lectures/002/Lecture-2.1.8/Lecture-2.1.8/index.htm

闃誨妯″紡

socket鐨勭己鐪佹柟寮忥紝涔熸槸鏈甯哥敤鐨勬柟寮忥紝鍗沖嚱鏁伴樆濉炵洿鍒拌皟鐢ㄥ畬姣曘?/font>

鍙兘閫犳垚闃誨鐨勫嚱鏁版湁錛歳ecvfrom() 銆乧onnect()銆乤ccept()銆佽鍐欏嚱鏁般乻elect()銆乸oll()銆乬ethostbyname()絳夈?/font>

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define MYPORT 3490聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽 /* 鐩戝惉鐨勭鍙?*/
#define BACKLOG 10聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽聽 /* listen鐨勮姹傛帴鏀墮槦鍒楅暱搴?*

void main() {

int sockfd, new_fd;聽聽聽聽聽聽聽聽聽聽聽 /* 鐩戝惉绔彛錛屾暟鎹鍙?*/
struct sockaddr_in sa;聽聽聽聽聽聽聽聽 /* 鑷韓鐨勫湴鍧淇℃伅 */
struct sockaddr_in their_addr; /* 榪炴帴瀵規柟鐨勫湴鍧淇℃伅 */
int sin_size;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {聽聽
聽聽聽 perror("socket");
聽聽聽 exit(1);
}
sa.sin_family = AF_INET;
sa.sin_port = htons(MYPORT);聽聽聽聽聽聽聽聽 /* 緗戠粶瀛楄妭欏哄簭 */
sa.sin_addr.s_addr = INADDR_ANY;聽聽聽聽 /* 鑷姩濉湰鏈篒P */
bzero(&(sa.sin_zero), 8);聽聽聽聽聽聽聽聽聽聽聽聽 /* 鍏朵綑閮ㄥ垎緗? */
if (bind(sockfd, (struct sockaddr *)&sa, sizeof(sa)) == -1) {聽聽
聽聽聽 perror("bind");
聽聽聽 exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {聽聽
聽聽聽 perror("listen");
聽聽聽 exit(1);
}
/* 涓誨驚鐜?*/

while(1) {
聽聽聽 sin_size = sizeof(struct sockaddr_in);
聽聽聽 new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size));
聽聽聽 if (new_fd == -1) {
聽聽聽 聽聽聽 perror("accept");
聽聽聽 聽聽聽 continue;
聽聽聽 }
聽聽聽 printf(鈥滸ot connection from %s\n", inet_ntoa(their_addr.sin_addr));
聽聽聽 if (fork() == 0) {聽聽聽 /* 瀛愯繘紼?*/聽聽 聽聽
聽聽聽 聽聽聽 if (send(new_fd, "Hello, world!\ n", 14, 0) == -1)聽聽 聽聽
聽聽聽 聽聽聽 聽聽聽 perror("send");
聽聽聽 聽聽聽 聽聽聽 close(new_fd);
聽聽聽 聽聽聽 聽聽聽 exit(0);
聽聽聽 }
聽聽聽 close(new_fd);聽聽聽 /*娓呴櫎鎵鏈夊瓙榪涚▼ */
聽聽聽 while(waitpid(-1,NULL,WNOHANG) > 0);
聽}
}


闈為樆濉炴ā寮?/font>

紼嬪簭璋冪敤鍙兘閫犳垚闃誨鐨勫嚱鏁版椂錛?br />濡傛灉浼?font color="#ff6600">鍙戠敓闃誨錛岃繖浜?font color="#ff6600">鍑芥暟榪斿洖-1騫跺皢errno璁劇疆涓篍AGAIN鎴朎WOULDBLOCK錛岀▼搴忓彲緇х畫鍚戜笅榪愯銆傚彲鑳介樆濉?br />鐨勫嚱鏁板搴旂殑浠誨姟瀹屾垚錛屽垯鍐嶆璋冪敤璇ュ嚱鏁版椂灝辮繑鍥?琛ㄧず榪愯緇撴潫銆?/font>

闈? 闃誨妯″紡鍙互閬垮厤紼嬪簭姝婚攣錛屼絾鏄渶瑕佺▼搴忎笉鏂鏌ュ悇涓彲鑳介樆濉炵殑鍑芥暟鐨勭姸鎬侊紝褰撲竴涓簲鐢ㄧ▼搴忎嬌鐢ㄤ簡
闈為樆濉炴ā寮忕殑濂楁帴瀛楋紝瀹冮渶瑕佷嬌鐢ㄤ竴涓驚鐜潵涓嶅惉鐨勬祴璇曟槸 鍚︿竴涓枃浠舵弿榪扮鏈夋暟鎹彲璇伙紙縐板仛polling錛夈?br />搴旂敤紼嬪簭涓嶅仠鐨刾olling鍐呮牳鏉ユ鏌ユ槸鍚/O鎿嶄綔宸茬粡灝辯華銆傝繖灝嗘槸涓涓瀬嫻垂CPU璧勬簮鐨勬搷 浣滐紝鍥犳涓嶈兘瀹為檯
搴旂敤銆備竴鑸潪闃誨妯″紡鏄笌鍚屾I/O妯″紡鍏卞悓浣跨敤鐨勩?/font>


鑾峰緱鎴栨敼鍙榮ocket鐨処/O灞炴э細

int ioctl(int sockfd,long cmd,unsigned long* argp);

cmd灞炴х被鍨嬶紝argp灞炴х殑鍙傛暟銆?br />甯哥敤鐨勬湁錛?br />FIONREAD錛岃繑鍥瀞ocket緙撳啿鍖轟腑鏈鏁版嵁鐨勫瓧鑺傛暟
FIONBIO錛宎rgp涓洪浂鏃朵負闃誨妯″紡錛岄潪闆舵椂涓洪潪闃誨妯″紡
SIOCATMARK 錛屽垽鏂槸鍚︽湁鏈鐨勫甫澶栨暟鎹紙浠呯敤浜嶵CP鍗忚錛夛紝榪斿洖true鎴杅alse

int fcntl(int fd, int cmd, long arg);

F_SETFL錛宎rp涓篛_NONBLOCK鏃惰繘鍏ラ潪闃誨妯″紡錛屼負0鏃惰繘鍏ラ樆濉炴ā寮忋?br />F_GETFL錛岃幏寰楀睘鎬с?/p>


I/O澶氳礬澶嶇敤錛堝悓姝/O妯″紡錛?/font>

聽聽聽聽 浣跨敤select()銆乸oll()絳夊嚱鏁板疄鐜板澶氫釜socket鐨勫悓姝/O鎿嶄綔銆傚畠鑳藉悓鏃剁瓑寰呭涓?
socket鎻忚堪絎︼紝鑰岃繖浜泂ocket鎻忚堪絎﹀叾涓殑浠繪剰涓涓繘鍏ヨ灝辯華/鍐欏氨緇?鍑洪敊鐘舵侊紝select()
鍑芥暟灝卞彲浠ヨ繑鍥炪?/font>

聽聽聽 聽聽

聽聽聽聽聽聽

socket杞閫夋嫨錛?/font>

int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

搴旂敤浜庡璺悓姝/O妯″紡


FD_ZERO(*set) 娓呯┖socket闆嗗悎

FD_SET(s, *set) 灝唖鍔犲叆socket闆嗗悎

FD_CLR(s, *set) 浠巗ocket闆嗗悎鍘繪帀s

FD_ISSET(s, *set) 鍒ゆ柇s鏄惁鍦╯ocket闆嗗悎

聽聽聽聽 甯告暟FD_SETSIZE錛氶泦鍚堝厓绱犵殑鏈澶氫釜鏁?/font>

絳夊緟閫夋嫨鏈哄埗錛?/font>

int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
鏄痵elect鏈哄埗鐨勪竴涓彉縐嶏紝搴旂敤浜庡璺悓姝/O妯″紡
ufds鏄痯ollfd緇撴瀯鐨勬暟緇勶紝鏁扮粍鍏冪礌涓暟涓簄fds銆?/font>

struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};
紼嬪簭孌佃妭閫?/font>int listenfd, connfd, maxfd=0;
int nready;
fd_set rset, allset;
struct sockaddr_in cliaddr, servaddr;
int clilen;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd > maxfd) maxfd = listenfd;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(4321);
bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
FD_ZERO(&allset);
FD_SET(listenfd, &allset);
listen(listenfd, 10);
/* main loop */
while (1) {
rset = allset;
nready = select(maxfd+1, &rset, NULL, NULL, NULL);
if (FD_ISSET(listenfd, &rset)) {
/* 鏈夋柊鐨勫鎴風榪炴帴璇鋒眰
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr*)&cliaddr,&clilen);
if (client_num == FD_SETSIZE) {
fprintf(stderr, "too many clients\n");
exit(-1);
}
FD_SET(connfd, &allset);
if (connfd > maxfd) maxfd = connfd;
if (--nready <= 0) continue;
}
//浠ヤ笅渚濇鍒ゆ柇FD_ISSET(鏌愪釜socket, &rset) 騫跺仛鐩稿簲澶勭悊
}

淇″彿椹卞姩I/O

聽 聽聽 聽聽聽聽聽聽聽聽聽聽聽聽聽

寮傛I/O





]]>
主站蜘蛛池模板: 蕉岭县| 利津县| 丹棱县| 麦盖提县| 平安县| 凌云县| 共和县| 太和县| 安多县| 合阳县| 收藏| 陇南市| 长春市| 尉氏县| 郁南县| 卢氏县| 云浮市| 新余市| 通榆县| 托克托县| 高淳县| 吉木萨尔县| 曲阳县| 呼图壁县| 古蔺县| 全南县| 哈密市| 沁阳市| 曲阳县| 湛江市| 乌拉特前旗| 延边| 滁州市| 高平市| 晋江市| 恩施市| 红河县| 台东县| 陇西县| 观塘区| 沾益县|