带域名解析的客户端:仅发送固定消息,但是能实现linux命令行解析
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
#include <netdb.h>
#define MSG "hello , i am coming\n"
void useage(char *progname)
{
printf("%s useage:\n",progname);
printf("-a(--h_alias):specify server IP alias\n");
printf("-i(--ipaddr):specify server IP address\n");
printf("-p(--port):specify server port\n");
printf("-h(--help):print this help information\n");
return;
}
int main(int argc, char **argv)
{
int sockfd = -1;
int rv = -1;
const char *ptr=NULL;
struct sockaddr_in servaddr;
char *servip=NULL;
int port=0;
char **pptr=NULL;
char *h_alias=NULL;
char buf1[32];
char buf[1024];
struct hostent *getname=NULL;
struct option opts[] = {
{"ipaddr",required_argument,NULL,'i'},
{"h_alias",required_argument,NULL,'a'},
{"port",required_argument,NULL,'p'},
{"help",no_argument,NULL,'h'},
{NULL,0,NULL,0}
};
int opt;
int idx;
while((opt = getopt_long(argc,argv,"i:a:p:h",opts,&idx)) != -1)
{
switch(opt)
{
case 'i':
servip = optarg;
break;
case 'p':
port = atoi(optarg);
break;
case 'h':
useage(argv[0]);
return 0;
case 'a':
h_alias = optarg;
break;
}
}
if(!((servip&&port&&!h_alias)||(!servip&&port&&h_alias)))
{
useage(argv[0]);
return 0;
}
if(h_alias)
{
getname = gethostbyname(h_alias);
if(getname == NULL)
{
printf("Get host_alias failure:%s\n",strerror(errno));
return -1;
}
memset(buf1,0,sizeof(buf1));
pptr = getname->h_addr_list;
if(NULL == (ptr = inet_ntop(getname->h_addrtype,*pptr,buf1,sizeof(buf1))))
{
printf("failure:%s\n",strerror(errno));
return -2;
}
printf("The IP address of %s is %s\n",h_alias,ptr);
memcpy(&servip,&ptr,sizeof(ptr));
}
printf("servip:%s\n",servip);
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
printf("Create socket failure:%s\n",strerror(errno));
return -3;
}
printf("Create socket[%d] successfully\n",sockfd);
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(port);
inet_aton(servip,&servaddr.sin_addr);
rv = connect(sockfd,(const struct sockaddr *)&servaddr,sizeof(servaddr));
if(rv < 0)
{
printf("Connect server[%s:%d] failure:%s\n",servip,port,strerror(errno));
return -4;
}
printf("Connect server[%s:%d] successfully:\n",servip,port);
while(1)
{
rv = write(sockfd,MSG,sizeof(MSG));
if(rv < 0)
{
printf("write failure:%s\n",strerror(errno));
return -5;
}
printf("write successfully!\n");
memset(buf,0,sizeof(buf));
rv = read(sockfd,buf,sizeof(buf));
if(rv < 0)
{
printf("read failure:%s\n",strerror(errno));
return -6;
}
else if(rv == 0)
{
printf("socket[%d] get disconnect\n",sockfd);
return -7;
}
else if(rv > 0)
{
printf("read %dbyte from sever:%s\n",rv,buf);
}
}
close(sockfd);
}
服务器端:带有linux命令行解析
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
#define MSG "hello , I am accept\n"
void useage(char *progname)
{
printf("%s useage:\n",progname);
printf("-p(--port):specify server listen port\n");
printf("-h(--help):print this help information\n");
return;
}
int main(int argc, char **argv)
{
int sockfd = -1;
int clifd = -1;
int rv = -1;
struct sockaddr_in cliaddr;
struct sockaddr_in servaddr;
socklen_t len;
int port=0;
char buf[1024];
struct option opts[] = {
{"port",required_argument,NULL,'p'},
{"help",no_argument,NULL,'h'},
{NULL,0,NULL,0}
};
int opt;
int idx;
while((opt = getopt_long(argc,argv,"p:h",opts,&idx)) != -1)
{
switch(opt)
{
case 'p':
port = atoi(optarg);
break;
case 'h':
useage(argv[0]);
return -1;
}
}
if(!port)
{
useage(argv[0]);
return 0;
}
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
printf("Create socket failure:%s\n",strerror(errno));
return -1;
}
printf("Create socket[%d] successfully\n",sockfd);
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(port);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
rv = bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(rv<0)
{
printf("socket[%d] bind on port[%d] failure:%s\n",sockfd,
port,strerror(errno));
return -2;
}
listen(sockfd,13);
// inet_aton(servip,&servaddr.sin_addr);
printf("Connect client successfully:\n");
while(1)
{
clifd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);
if(clifd<0)
{
printf("Accept new client faliure:%s\n",strerror(errno));
continue;
}
printf("Accept new client[%s:%d] successfully!\n",
inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
memset(buf,0,sizeof(buf));
rv = read(clifd,buf,sizeof(buf));
if(rv < 0)
{
printf("read failure:%s\n",strerror(errno));
close(clifd);
continue;
}
else if(rv == 0)
{
printf("socket[%d] get disconnect\n",clifd);
close(clifd);
continue;
}
else if(rv > 0)
{
printf("read %dbyte from client:%s\n",rv,buf);
}
rv = write(clifd,MSG,sizeof(MSG));
if(rv < 0)
{
printf("write failure:%s\n",strerror(errno));
close(clifd);
continue;
}
printf("close client socket[%d]\n",clifd);
close(clifd);
}
close(sockfd);
}
注意getopt_long的用法