#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;
//向系統(tǒng)注冊,通知系統(tǒng)建立一個通信端口
//AF_INET表示使用IPv4協(xié)議
//SOCK_STREAM表示使用TCP協(xié)議
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;
}
/**************************************************************
* 發(fā)送消息,如果出錯返回-1,否則返回發(fā)送的字符長度
* sockfd:socket標識,sendBuff:發(fā)送的字符串
* *********************************************************/
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,否則返回接受字符串的指針(動態(tài)分配,注意釋放)
*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
破繭而出 閱讀(6529)
評論(2) 編輯 收藏 所屬分類:
C/C++