?? test12_5.txt
字號:
/*客戶端代碼*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
//#include <unp.h>
#include <sys/time.h>
#define MAXSIZE 80
void str_cli(FILE *,int)
int main(int argc,char **argv)
{
int sockfd,ret,len;
struct sockaddr_in ser_addr;
char *myname;
struct hostent *sh;
struct in_addr **addrs;
if(argc!=2){
printf("parameters not match.");
exit(0);
}
/*判斷參數(shù)是否匹配 */
if((sh=gethostbyname(argv[1]))==NULL){
printf("error when gethostbyname");
exit(0);
}
/* 根據(jù)服務(wù)器名獲得詳細信息*/
addrs=(struct in_addr **)sh->h_addr_list;
for(;*addrs!=NULL;addrs++){
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
printf("error in socket");
exit(1);
}
/* 創(chuàng)建套接口*/
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=sh->h_port;
memcpy(ser_addr,sin_addr,*addrs,sizeof(struct in_addr));
bzero(&(ser_addr.sin_zero),8);
ret=connect(sockfd,(SA *)&ser_addr,sizeof(struct sockaddr));
if(ret==0)
break;
/* 連接成功則跳出循環(huán)*/
else {
printf("error connecting");
close(sockfd);
}
}
/*嘗試與服務(wù)器的各個地址連接,知道連接上其中一個為止 */
if(*addrs==NULL){
printf("can’t get connected with server");
exit(0);
}
/*連接不成功則報錯并退出 */
str_cli(stdin,sockfd);
/*數(shù)據(jù)傳輸操作 */
close(sockfd);
exit(0);
}
void str_cli(FILE *fp,int sockfd,struct addr *addr,int addrlen)
{
char sends[MAXSIZE],recvs[MAXSIZE];
int n=0,maxfd;
fd_set aset;
FD_ZERO(&aset);
FD_SET(fileno(fp),&aset);
FD_SET(sockfd,&aset);
maxfd=max(fileno(fd),sockfd)+1;
select(maxfd,&aset,NULL,NULL,NULL);
/*選擇I/O */
while(true)
{
if(FD_ISSET(sockfd,&aset)){
if((n=recv(sockfd,recvs,MAXSIZE,0))==0){
printf("error receiving data");
exit(1);
}
recvs[n]=0;
/*加上字符串結(jié)束標記 */
fputs(recvs,stdout);
}
/*從套接口接收數(shù)據(jù)的處理 */
if(FD_ISSET(fp,&asset)){
if(fgets(sends,MAXSIZE,fp)==NULL)
return;
/*如果讀到空字符串,結(jié)束數(shù)據(jù)處理函數(shù) */
sendt(sockfd,sends,strlen(sends),0);
}
/*從標準輸入讀入數(shù)據(jù)的處理 */
}
}
/*服務(wù)器端代碼*/
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
//#include <unp.h>
#include <sys/time.h>
#include <sys/select.h>
#define MYPORT 3490
#define BACKLOG 10
#define BUFSIZE 100
#define MAXSELECT 100
#define MAXSIZE=80
main ( )
{
int sockfd,con_fd,sock,numbytes,ret,maxfd,maxi,I,nready;
int client[MAXSELECT];
fd_set *allset,rset;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
char *buf;
char revcs[MAXSIZE];
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
printf("error in socket");
exit(1);
}
/*創(chuàng)建監(jiān)聽套接口 */
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&(my_addr.sin_zero),8);
ret=bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
if(ret<0){
printf("error in binding");
exit(1);
}
/*綁定監(jiān)聽套接口 */
ret=listen (sockfd,BACKLOG);
if(ret<0){
printf("error in listening");
exit(1);
}
/* 監(jiān)聽連接請求*/
maxfd=listenfd;
maxi=-1;
for(i=0;i<MAXSELECT;i++)
client[i]=0;
FD_ZERO(&allset);
FD_SET(sockfd,&allset);
/*設(shè)置select()有關(guān)參數(shù) */
while(true)
{
rect=allset;
nready=select(maxfd+1,&rset,NULL,NULL,NULL);
/*選擇,nready記錄可選的文件個數(shù) */
if(FD_ISSET(sockfd,&rset)){
sin_size=sizeof(struct sockaddr_in);
con_fd=accept(sockfd,(SA *)&their_addr,&sin_size);
if(con_fd<0){
printf("error in accept");
exit(1);
}
/*創(chuàng)建新的連接 */
for(i=0;i<MAXSELECT;i++){
if(client[i]<0)
{
client[i]=con_fd;
break;
}
if(i==MAXSELECT){
printf("too manyclients");
continue;
}
FD_SET(con_fd,&allset);
if(con_fd>maxfd)
maxfd= ;
if(i>maxi)
maxi=i;
/*更新select()有關(guān)參數(shù) */
if(--nready<=0)
continue;
/*如果沒有描述字未處理,進入下一個循環(huán) */
}
/*處理監(jiān)聽套接口 */
for(i=0;i<maxi;i++){
if((sock=client[i]<0)
continue;
/*如果套接口不存在,處理下一個套接口 */
if(FD_ISSET(sock,&^rset)){
if(recv(sockfd,recvs,MAXSIZE,0)==0){
close(sock);
FD_CLR(sock,&allset);
client[i]=-1;
}
else
/*數(shù)據(jù)處理 */
}
/*處理一個連接套接口 */
if(--nready<=0)
break;
/*如果沒有描述字未處理,進入下一個循環(huán) */
}
/*處理各個連接套接口 */
}
close(sockfd);
exit(0);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -