好的,多谢!
/* server.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define PORT 2222
#define LISTEN 10
#define MAX_RECV 20
int main()
{ //定义变量
struct sockaddr_in server_sock,client_sock;
int sockfd,client_fd;
int socklen=sizeof(struct sockaddr_in);
int iMsg=0;
extern int errno;
char buf[MAX_RECV];//接收缓冲区
char *SERVER_MESSG[]=
{
//"Hi,I am Fedora10 host!",
"Your User ID:",
"Your Password:",
"Welcome you,",
NULL
};
char *CLIENT_INFO[]=
{
"FriendlyARM",
"123456"
};
//创建socket数据结构
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
printf("socket success!,sockfd=%d\n",sockfd);
//初始化服务器端socket
memset(&server_sock,0,socklen);
server_sock.sin_family=AF_INET;
server_sock.sin_port=htons(PORT);
server_sock.sin_addr.s_addr=htonl(INADDR_ANY);
//绑定端口
if(bind(sockfd,(struct sockaddr *)&server_sock,socklen)==-1)
{
perror("bind");
exit(1);
}
printf("bind success!\n");
//监听...
if(listen(sockfd,LISTEN)==-1)
{
perror("listen");
exit(1);
}
printf("listening...\n");
//循环处理
while(1)
{ //接受处理
if((client_fd=accept(sockfd,(struct sockaddr *)&client_sock,&socklen))==-1)
{
perror("accept");
exit(1);
}
else printf("accept success!\n");
//处理过程
do
{//向客户机发送信息
if(send(client_fd,SERVER_MESSG[iMsg],strlen(SERVER_MESSG[iMsg]),0)==-1)
{
perror("send");
printf("errno=%d\n",errno);
char * mesg = strerror(errno);
printf("Mesg:%s\n",mesg);
exit(1);
}
printf("Have sent:%s\n",SERVER_MESSG[iMsg]);
//处理来自客户机的验证信息
while(iMsg<2)
{
bzero(buf,MAX_RECV);
if(recv(sockfd,buf,MAX_RECV,0)==-1)
{
perror("recv");
printf("errno=%d\n",errno);
char * mesg = strerror(errno);
printf("Mesg:%s\n",mesg);
exit(1);
}
if(strcmp(buf,CLIENT_INFO[iMsg])==0)break;
else
if(send(sockfd,"WRONG! Try again!",strlen("WRONG!Try again!"),0)==-1);
{
perror("send");
exit(1);
}
}
//指向下一条消息
iMsg++;
}while(SERVER_MESSG[iMsg]);//一次处理过程结束
close(client_fd);
}//等待下一个客户机连接
close(sockfd);
}
/* client.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#define PORT 2222
#define MAX_RECV 20
#define MAX_INFO 15
int main(int argc,char **argv)
{ //定义变量
struct sockaddr_in serv_addr;
int sockfd,n,i=0;
//char *host_ip;
char buf[MAX_RECV],user_info[MAX_INFO];
struct hostent *host;
int socklen=sizeof(struct sockaddr_in);
//参数检查
if(argc!=2)
{
printf("Input error!Try again:./%s <host IP>\n",argv[0]);
exit(1);
}
//获取主机socket信息
if(inet_aton(argv[1],&serv_addr.sin_addr)==-1)
{
perror("inet_aton");
exit(1);
}
if((host=gethostbyaddr((char *)&serv_addr.sin_addr,4,AF_INET))==NULL)
{
perror("gethostbyaddr");
exit(1);
}
printf("%s\n",host->h_name);
//创建socket数据结构
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
//初始化服务器端socket
memset(&serv_addr,0,socklen);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr= *(struct in_addr *)(host->h_addr);//需要头文件#include<netdb.h>,要不提示错误:提领指向不完全类型的指针
//向服务器发起连接
if(connect(sockfd,(struct sockaddr *)&serv_addr,socklen)==-1)
{
perror("connect");
exit(1);
}
else printf("connect success!\n");
//sleep(2);
//与服务器通信
while(i<3)
{
if((n=recv(sockfd,buf,MAX_RECV,0))==-1) //搞清send和recv函数里的socket描述符,accept和connect函数的返回值
{
perror("recv");
exit(1);
}
else
{
buf[n]='\0';
printf("HOST:%s\n",buf);
}
if(strcmp(buf,"WRONG! Try again!")==0)i--;
while(i<2)
{
if(fgets(user_info,MAX_INFO,stdin) == NULL)
{
printf("fgets error!\n");
exit(1);
}
if(send(sockfd,user_info,strlen(user_info),0)==-1)
{
perror("send");
exit(1);
}
break;
}
i++;
}
close(sockfd);
return 0;
}