//client.c 客户端
int main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
char s[50];
struct hostent *host;
struct sockaddr_in serv_addr;
if(argc < 2)
{
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname error!");
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)//建立socket --
{
perror("socket create error!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) //请求连接 --
{
perror("connect error!");
exit(1);
}
//successful connection
if((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)//接收数据 --
{
perror("connect 出错!");
exit(1);
}
buf[recvbytes] = '\0';
printf("收到: %s",buf);
//send another piece of message to server
send(sockfd, "liu", 3, 0);
//receive a piece of message "Bingo" or "incorrect username" from server
int nbytes = recv(sockfd, s, 100, 0);
s[nbytes] = '\0';
printf("%s", s);
close(sockfd);//关闭连接 --
}
//server.c 服务端
int main()
{
int sockfd,client_fd;
int sin_size;
char s[50];
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);//建立socket --
my_addr.sin_family=AF_INET;//AF_INET地址族
my_addr.sin_port=htons(SERVPORT);//设定端口号(host -> networks)
my_addr.sin_addr.s_addr = INADDR_ANY;//32位IPv4地址
bzero(&(my_addr.sin_zero),8); //置前8个字节为0
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind 出错!");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) //监听socket连接,设置队列中最多拥有连接个数为10 --
{
perror("listen 出错!");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);//记录sockaddr_in结构体所占字节数
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) //accept()缺省是阻塞函数,阻塞到有连接请求为止 --
{
perror("accept error");
continue;
}
printf("收到一个连接来自: %s\n", inet_ntoa(remote_addr.sin_addr));
if (!fork())
{
if (send(client_fd, "连接上了 \n", 26, 0) == -1) //--
perror("send 出错!");
//receive a piece of message from host
int nbytes = recv(client_fd, s, 100, 0);
s[nbytes] = '\0';
if(s[0] == 'l' && s[1] == 'i' && s[2] == 'u' && nbytes == 3)
{
//send the message "Bingo" to host
send(client_fd, "Bingo\n" ,6, 0);
}
else
{
//send the message "incorrect username" to host
send(client_fd, "incorrect username\n", 26, 0);
}
close(client_fd);
exit(0);
}
close(client_fd);
}
}