⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 网络编程.txt

📁 linux 下的服务端和客户端连接
💻 TXT
📖 第 1 页 / 共 3 页
字号:
exit(1); 
} 
/* 接收由server端传来的信息*/ 
recv(s,buffer,sizeof(buffer),0); 
printf(“%s\n”,buffer); 
while(1){ 
bzero(buffer,sizeof(buffer)); 
/* 从标准输入设备取得字符串*/ 
read(STDIN_FILENO,buffer,sizeof(buffer)); 
/* 将字符串传给server端*/ 
if(send(s,buffer,sizeof(buffer),0)<0){ 
perror(“send”); 
exit(1); 
} 
} 
} 
 
执行  $ ./connect 
Welcome to server! 
hi I am client! /*键盘输入*/ 
/*<Ctrl+C>中断程序*/ 
 
  

 


endprotoent(结束网络协议数据的读取)  
相关函数  getprotoent,getprotobyname,getprotobynumber,setprotoent 
 
表头文件  #i nclude<netdb.h> 
 
定义函数  void endprotoent(void); 
 
函数说明  endprotoent()用来关闭由getprotoent()打开的文件。 
 
返回值  
 
范例  参考getprotoent() 
 
  

 


endservent(结束网络服务数据的读取)  
相关函数  getservent,getservbyname,getservbyport,setservent 
 
表头文件  #i nclude<netdb.h> 
 
定义函数  void endservent(void); 
 
函数说明  endservent()用来关闭由getservent()所打开的文件。 
 
返回值  
 
范例  参考getservent()。 
 
  

 


getsockopt(取得socket状态)  
相关函数  setsockopt 
 
表头文件  #i nclude<sys/types.h> 
#i nclude<sys/socket.h> 
 
定义函数  int getsockopt(int s,int level,int optname,void* optval,socklen_t* optlen); 
 
函数说明  getsockopt()会将参数s所指定的socket状态返回。参数optname代表欲取得何种选项状态,而参数optval则指向欲保存结果的内存地址,参数optlen则为该空间的大小。参数level、optname请参考setsockopt()。 
 
返回值  成功则返回0,若有错误则返回-1,错误原因存于errno 
 
错误代码  EBADF 参数s 并非合法的socket处理代码 
ENOTSOCK 参数s为一文件描述词,非socket 
ENOPROTOOPT 参数optname指定的选项不正确 
EFAULT 参数optval指针指向无法存取的内存空间 
 
范例  #i nclude<sys/types.h> 
#i nclude<sys/socket.h> 
main() 
{ 
int s,optval,optlen = sizeof(int); 
if((s = socket(AF_INET,SOCK_STREAM,0))<0) perror(“socket”); 
getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen); 
printf(“optval = %d\n”,optval); 
close(s);} 
 
执行  optval = 1 /*SOCK_STREAM的定义正是此值*/ 
 
  

 


htonl(将32位主机字符顺序转换成网络字符顺序)  
相关函数  htons,ntohl,ntohs 
 
表头文件  #i nclude<netinet/in.h> 
 
定义函数  unsigned long int htonl(unsigned long int hostlong); 
 
函数说明  htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。 
 
返回值  返回对应的网络字符顺序。 
 
范例  参考getservbyport()或connect()。 
 
  

 


htons(将16位主机字符顺序转换成网络字符顺序)  
相关函数  htonl,ntohl,ntohs 
 
表头文件  #i nclude<netinet/in.h> 
 
定义函数  unsigned short int htons(unsigned short int hostshort); 
 
函数说明  htons()用来将参数指定的16位hostshort转换成网络字符顺序。 
 
返回值  返回对应的网络字符顺序。 
 
范例  参考connect()。 
 
  

 


inet_addr(将网络地址转成二进制的数字)  
相关函数  inet_aton,inet_ntoa 
 
表头文件  #i nclude<sys/socket.h> 
#i nclude<netinet/in.h> 
#i nclude<arpa/inet.h> 
 
定义函数  unsigned long int inet_addr(const char *cp); 
 
函数说明  inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例如:“163.13.132.68”。 
 
返回值  成功则返回对应的网络二进制的数字,失败返回-1。 
 
  

 


inet_aton(将网络地址转成网络二进制的数字)  
相关函数  inet_addr,inet_ntoa 
 
表头文件  #i nclude<sys/scoket.h> 
#i nclude<netinet/in.h> 
#i nclude<arpa/inet.h> 
 
定义函数  int inet_aton(const char * cp,struct in_addr *inp); 
 
函数说明  inet_aton()用来将参数cp所指的网络地址字符串转换成网络使用的二进制的数字,然后存于参数inp所指的in_addr结构中。 
结构in_addr定义如下 
struct in_addr 
{ 
unsigned long int s_addr; 
}; 
 
返回值  成功则返回非0值,失败则返回0。 
 
  

 


inet_ntoa(将网络二进制的数字转换成网络地址)  
相关函数  inet_addr,inet_aton 
 
表头文件  #i nclude<sys/socket.h> 
#i nclude<netinet/in.h> 
#i nclude<arpa/inet.h> 
 
定义函数  char * inet_ntoa(struct in_addr in); 
 
函数说明  inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。 
 
返回值  成功则返回字符串指针,失败则返回NULL。 
 
  

 


listen(等待连接)  
相关函数  socket,bind,accept,connect 
 
表头文件  #i nclude<sys/socket.h> 
 
定义函数  int listen(int s,int backlog); 
 
函数说明  listen()用来等待参数s 的socket连线。参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误。Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。 
 
返回值  成功则返回0,失败返回-1,错误原因存于errno 
 
附加说明  listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果socket为AF_INET则参数backlog 最大值可设至128。 
 
错误代码  EBADF 参数sockfd非合法socket处理代码 
EACCESS 权限不足 
EOPNOTSUPP 指定的socket并未支援listen模式。 
 
范例  #i nclude<sys/types.h> 
#i nclude<sys/socket.h> 
#i nclude<netinet/in.h> 
#i nclude<arpa/inet.h> 
#i nclude<unistd.h> 
#define PORT 1234 
#define MAXSOCKFD 10 
main() 
{ 
int sockfd,newsockfd,is_connected[MAXSOCKFD],fd; 
struct sockaddr_in addr; 
int addr_len = sizeof(struct sockaddr_in); 
fd_set readfds; 
char buffer[256]; 
char msg[ ] =”Welcome to server!”; 
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){ 
perror(“socket”); 
exit(1); 
} 
bzero(&addr,sizeof(addr)); 
addr.sin_family =AF_INET; 
addr.sin_port = htons(PORT); 
addr.sin_addr.s_addr = htonl(INADDR_ANY); 
if(bind(sockfd,&addr,sizeof(addr))<0){ 
perror(“connect”); 
exit(1); 
} 
if(listen(sockfd,3)<0){ 
perror(“listen”); 
exit(1); 
} 
for(fd=0;fd<MAXSOCKFD;fd++) 
is_connected[fd]=0; 
while(1){ 
FD_ZERO(&readfds); 
FD_SET(sockfd,&readfds); 
for(fd=0;fd<MAXSOCKFD;fd++) 
if(is_connected[fd]) FD_SET(fd,&readfds); 
if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue; 
for(fd=0;fd<MAXSOCKFD;fd++) 
if(FD_ISSET(fd,&readfds)){ 
if(sockfd = =fd){ 
if((newsockfd = accept (sockfd,&addr,&addr_len))<0) 
perror(“accept”); 
write(newsockfd,msg,sizeof(msg)); 
is_connected[newsockfd] =1; 
printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr)); 
}else{ 
bzero(buffer,sizeof(buffer)); 
if(read(fd,buffer,sizeof(buffer))<=0){ 
printf(“connect closed.\n”); 
is_connected[fd]=0; 
close(fd); 
}else 
printf(“%s”,buffer); 
} 
} 
} 
} 
 
执行  $ ./listen 
connect from 127.0.0.1 
hi I am client 
connected closed. 
 
  

 


ntohl(将32位网络字符顺序转换成主机字符顺序)  
相关函数  htonl,htons,ntohs 
 
表头文件  #i nclude<netinet/in.h> 
 
定义函数  unsigned long int ntohl(unsigned long int netlong); 
 
函数说明  ntohl()用来将参数指定的32位netlong转换成主机字符顺序。 
 
返回值  返回对应的主机字符顺序。 
 
范例  参考getservent()。 
 
  

 


ntohs(将16位网络字符顺序转换成主机字符顺序)  
相关函数  htonl,htons,ntohl 
 
表头文件  #i nclude<netinet/in.h> 
 
定义函数  unsigned short int ntohs(unsigned short int netshort); 
 
函数说明  ntohs()用来将参数指定的16位netshort转换成主机字符顺序。 
 
返回值  返回对应的主机顺序。 
 
范例  参考getservent()。 
 
  

 


recv(经socket接收数据)  
相关函数  recvfrom,recvmsg,send,sendto,socket 
 
表头文件  #i nclude<sys/types.h> 
#i nclude<sys/socket.h> 
 
定义函数  int recv(int s,void *buf,int len,unsigned int flags); 
 
函数说明  recv()用来接收远端主机经指定的socket传来的数据,并把数据存到由参数buf 指向的内存空间,参数len为可接收数据的最大长度。 
 
参数  flags一般设0。其他数值定义如下: 
MSG_OOB 接收以out-of-band 送出的数据。 
MSG_PEEK 返回来的数据并不会在系统内删除,如果再调用recv()会返回相同的数据内容。 
MSG_WAITALL强迫接收到len大小的数据后才能返回,除非有错误或信号产生。 
MSG_NOSIGNAL此操作不愿被SIGPIPE信号中断返回值成功则返回接收到的字符数,失败返回-1,错误原因存于errno中。 
 
错误代码  EBADF 参数s非合法的socket处理代码 
EFAULT 参数中有一指针指向无法存取的内存空间 
ENOTSOCK 参数s为一文件描述词,非socket。 
EINTR 被信号所中断 
EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断 
ENOBUFS 系统的缓冲内存不足。 
ENOMEM 核心内存不足 
EINVAL 传给系统调用的参数不正确。 
 
范例  参考listen()。 
 
  

 


recvfrom(经socket接收数据)  
相关函数  recv,recvmsg,send,sendto,socket 
 
表头文件  #i nclude<sys/types.h> 
#i nclude<sys/socket.h> 
 
定义函数  int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -