posts - 108,comments - 56,trackbacks - 0
#include   <sys/stat.h>   
#include   
<sys/types.h>   
#include   
<sys/socket.h>   
#include   
<stdio.h>   
#include   
<malloc.h>   
#include   
<netdb.h>   
#include   
<fcntl.h>
#include   
<unistd.h>
#include   
<netinet/in.h>
#include   
<arpa/inet.h>

#define    RES_LENGTH  10240 //接受字符的最大长度

int     connect_socket(char * server,int serverPort);
int     send_msg(int sockfd,char * sendBuff);
char *  recv_msg(int sockfd);
int     close_socket(int sockfd);

int main(int argc,char ** argv)
{
    
int    sockfd=0;
    
char     sendMsg[30]="abc.org\r\n\r";
    
char    * res;
    sockfd
=connect_socket("whois.pir.org",43);
    send_msg(sockfd,sendMsg);
    res
=recv_msg(sockfd);
    printf(res);
    free(res);
    close_socket(sockfd);
    
return 0;
}
/************************************************************
 * 连接SOCKET服务器,如果出错返回-1,否则返回socket处理代码
 * server:服务器地址(域名或者IP),serverport:端口
 * *******************************************************
*/
int    connect_socket(char * server,int serverPort){
    
int    sockfd=0;
    
struct    sockaddr_in    addr;
    
struct    hostent        * phost;
    
//向系统注册,通知系统建立一个通信端口
    
//AF_INET表示使用IPv4协议
    
//SOCK_STREAM表示使用TCP协议
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
        herror(
"Init socket error!");
        
return -1;
    }

    bzero(
&addr,sizeof(addr));
    addr.sin_family
=AF_INET;
    addr.sin_port
=htons(serverPort);
    addr.sin_addr.s_addr
=inet_addr(server);//按IP初始化
    if(addr.sin_addr.s_addr == INADDR_NONE){//如果输入的是域名
        phost = (struct hostent*)gethostbyname(server);
        
if(phost==NULL){
            herror(
"Init socket s_addr error!");
            
return -1;
        }
        addr.sin_addr.s_addr 
=((struct in_addr*)phost->h_addr)->s_addr;
    }
    
if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr))<0)
        
return -1;//0表示成功,-1表示失败
    else
        
return sockfd;

}

/**************************************************************
 * 发送消息,如果出错返回-1,否则返回发送的字符长度
 * sockfd:socket标识,sendBuff:发送的字符串
 * ********************************************************
*/
int    send_msg(int sockfd,char * sendBuff){
    
int    sendSize=0;
    
if((sendSize=send(sockfd,sendBuff,strlen(sendBuff),0))<=0){
        herror(
"Send msg error!");
        
return -1;
    }
else
        
return sendSize;
}

/****************************************************************
 *接受消息,如果出错返回NULL,否则返回接受字符串的指针(动态分配,注意释放)
 *sockfd:socket标识
 * ********************************************************
*/
char *    recv_msg(int sockfd){
    
char * response;
    
int  flag=0,recLenth=0;
    response
=(char *)malloc(RES_LENGTH);
    memset(response,
0,RES_LENGTH);
    
for(flag=0;;){
        
if((recLenth=recv(sockfd,response+flag,RES_LENGTH-flag,0))==-1){
            free(response);
            herror(
"Recv msg error!");
            
return NULL;
        }
else if(recLenth==0)
            
break;
        
else{
            flag
+=recLenth;
            recLenth
=0;
        }
    }
    response[flag]
='\0';
    
return response;
}
/**************************************************
 *关闭连接
 * *********************************************
*/
int    close_socket(int sockfd){
    close(sockfd);
    
return 0;
}
posted on 2007-12-17 11:14 破茧而出 阅读(6521) 评论(2)  编辑  收藏 所属分类: C/C++

FeedBack:
# re: Socket客户端例子[C语言]
2008-03-26 16:00 | wangfeizjk
为什么我用你这个客户端接收的时候会报错啊。这个错误是为什么Recv msg error! : Resolver Error 0 (no error)
  回复  更多评论
  
# re: Socket客户端例子[C语言]
2011-11-10 10:58 | Norz
@wangfeizjk
你是在windows下吧?
win下创建socket需要先初始化WSADATA  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: