connect_client.c

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

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

#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif

SOCKET   sockconnect(const char *host,const char *service,const char *transport);

/*-------------------------------------------------------------------------
 *connectUDP
 *-------------------------------------------------------------------------
 */
SOCKET 
UDPconnect(const char *host,const char *service)
{
  return  sockconnect(host,service,"udp");   
}

/*-------------------------------------------------------------------------
 *connectTCP
 *-------------------------------------------------------------------------
 */
SOCKET 
TCPconnect(const char *host,const char *service)
{
  return  sockconnect(host,service,"tcp");   
}

/*-------------------------------------------------------------------------
 *
 *-------------------------------------------------------------------------
 */
 SOCKET  
 sockconnect(const char *host,const char *service,const char *transport)
 {
 	struct hostent *phe;      /*host information     */
 	struct servent *pse;      /* server information  */ 
 	struct protoent *ppe;     /*protocol information */
 	struct sockaddr_in sin;   /*endpoint IP address  */
 	int s, type;              /* socket description  */

 	memset(&sin,0,sizeof(sin));
 	sin.sin_family=AF_INET;
 	
 	/**** get port number from  service  ****/
 	if( pse=getservbyname(service,transport) )
 	      sin.sin_port=pse->s_port;                             /*  port */  
 	else if( (sin.sin_port=htons( (u_short)atoi(service)))==0)
 	{
 	   printf("get server information error \n");
 	   WSACleanup();
 	   exit(1);
        }
        
        /**** get IP address from  host name ****/ 
 	if(phe=gethostbyname(host)) 
  	      memcpy(&sin.sin_addr,phe->h_addr,phe->h_length);         /*  host IP address  */
	 else if( (sin.sin_addr.s_addr=inet_addr(host))==INADDR_NONE )
  	{
 	   printf("get host IP information error \n");
 	   WSACleanup();
 	   exit(1);
        }
        
        /**** get protocol number  from protocol name  ****/
 	if( (ppe=getprotobyname(transport))==0)
 	{
 	   printf("get protocol information error \n");
 	   WSACleanup();
 	   exit(1);
        }
 
       
 	if(strcmp(transport,"udp")==0)
    	  type=SOCK_DGRAM;
 	else
    	 type=SOCK_STREAM;    


        /**** creat a socket description ****/ 
	s=socket(PF_INET,type,ppe->p_proto);
	
 	if( s==INVALID_SOCKET)
 	{
 	   printf(" creat socket error \n");
 	   WSACleanup();
 	   exit(1);
        }
 
 	if(  connect(s,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR  )
  	{
 	   printf("connect socket  error \n");
 	   WSACleanup();
 	   exit(1);
        }

 	return s;
 
 
 }
 

⌨️ 快捷键说明

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