passive_server.c

来自「一个基于windows api 的源程序...有很强的参考价值」· C语言 代码 · 共 96 行

C
96
字号
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <winsock.h>

u_short  portbase = 0 ;

SOCKET sockserver(const char *service,const char *transport,int qlen);

 /*-------------------------------------------------------------------
 * udppassive
 *-------------------------------------------------------------------
 */
 SOCKET
 UDPserver(const char *service)  
 {
   return  sockserver(service,"udp",0);   
 }
 
/*-------------------------------------------------------------------
 * tcppassive
 *-------------------------------------------------------------------
 */
 SOCKET
 TCPserver(const char *service,int qlen)
 {
   return   sockserver(service,"tcp",qlen);
 }
 
/*-------------------------------------------------------------------
 * 
 *-------------------------------------------------------------------
 */
 SOCKET 
 sockserver(const char *service,const char *transport,int qlen)
 {
 	struct  servent  *pse;    /* server information    */
  	struct  protoent *ppe;    /* proto information     */
   	struct sockaddr_in sin;   /* endpoint IP address   */
   	int  s,type;              /* socket description    */
   	
   	memset(&sin,0,sizeof(sin));
  	 sin.sin_family=AF_INET;
   	sin.sin_addr.s_addr = INADDR_ANY;
   
        /* get portnumber from  service name    */
  	if(pse=getservbyname(service,transport) )
  		sin.sin_port=htons(ntohs((u_short)pse->s_port));
 	else  if( (sin.sin_port=htons((u_short)atoi(service)))==0)
 	{
 	   printf("  get portnumber error \n");
 	   WSACleanup();
 	   exit(1);
        }
        
        /* get protocol number from protocol name */
  	if((ppe=getprotobyname(transport))==0)
   	{
 	   printf("  get protocol number error \n");
 	   WSACleanup();
 	   exit(1);
        }
 
        /* choose socket type    */ 
  	if(strcmp(transport,"udp")==0)
   	  type=SOCK_DGRAM;
  	else
  	   type=SOCK_STREAM;
  
  	s=socket(PF_INET,type,ppe->p_proto);
 	if( s==INVALID_SOCKET)
 	{
 	   printf(" creat socket error \n");
 	   WSACleanup();
 	   exit(1);
        }
   
 	if(bind(s,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR ) 
   	 {
 	   printf("  socket bind error \n");
 	   WSACleanup();
 	   exit(1);
     }
 	
 	
 	if(type==SOCK_STREAM && listen(s,qlen)==SOCKET_ERROR)  
    	{
 	    printf("  socket listen error \n");
 	    WSACleanup();
 	    exit(1);
        }

	return s;

 
 }

⌨️ 快捷键说明

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