//伺服器客戶端均已修改
//伺服器
#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 控制代碼 的狀...