本例要用到系统自带的ssh(安全外壳协议)服务器,所以使用之前要先安装和开启ssh服务器。
1.linux开启ssh
- 首先更新源
sudo apt-get update
- 安装ssh服务
sudo apt-get install openssh-server
- 检测是否已启动
ps -e | grep ssh
看到有ssh字样,说明已启动,如果没有就手动启动
/etc/init.d/ssh start
- 配置ssh-server,配置文件位于/etc/ssh/sshd_config,默认端口为22,为了安全,一般自定义为其他端口,然后重启
sudo /etc/init.d/ssh resart
在windows中,使用putty或者SSH Secure Shell等登录虚拟机
2.测试代码
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <sys/time.h>
#include <sys/resource.h>
#define MAXBUFF 1024
/********************************************************************
*函数功能:根据指数补偿算法重新尝试连接
*参考:APUE
*返回值:成功返回套接字描述符,失败返回-1
*******************************************************************/
int connectRetry(int domain,int type,int protocol,const struct sockaddr *addr,socklen_t alen,int MAXSLEEP)
{
int numsec,fd;
for(numsec=1;numsec<=MAXSLEEP;numsec<<=1)
{
if((fd=socket(domain,type,protocol))<0)
return -1;
if(connect(fd,addr,alen)==0)
return fd;
close(fd);
if(numsec<=MAXSLEEP/2)
sleep(numsec);
}
return -1;
}
int main(int argc,char **argv)
{
struct sockaddr_in dest;
int sockfd;
char buff[MAXBUFF];
/* 初始化服务器端(对方)的地址和端口信息 */
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(atoi(argv[2]));
if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
perror(argv[1]);
exit(errno);
}
if((sockfd=connectRetry(AF_INET,SOCK_STREAM,0,(struct sockaddr *)&dest,sizeof(dest),128))==-1)
{
perror("connect retry");
exit(1);
}
/*初始化缓冲区*/
bzero(buff,MAXBUFF);
recv(sockfd, buff, sizeof(buff), 0);
printf("%s", buff);
/* 关闭连接 */
close(sockfd);
return 0;
}
3.运行
./client 127.0.0.1 22