/*service.c*/
#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>
#define MYPORT 8888 //开放的端口号 1到1024是保留端口
#define BACKLOG 5 //指定套接字可以接受的最大客户机请求数目
int main(void)
{
int sockfd,new_fd;
struct sockaddr_in srvaddr;
struct sockaddr_in cliaddr;
int sin_size;
//创建套接字描述符
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket error");
exit(1);
}
bzero(&srvaddr,sizeof(srvaddr));
//用自己的ip地址和端口信息填充一个internet套接字地址结构
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(MYPORT);
//函数bind将服务器的地址和套接字绑定在一起
if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr)) == -1)
{
perror("bind error");
exit(1);
}
//listen函数告诉内核,这个套接字可以接受来自客户机的请求
if(listen(sockfd,BACKLOG) == -1)
{
perror("listen error");
exit(1);
}
//处理客户机的请求,使用函数accept来获得一个客户机的连接
for(;;)
{
sin_size = sizeof(struct sockaddr_in);
if((new_fd = accept(sockfd,(struct sockaddr *)&cliaddr,&sin_size)) == -1)
{
perror("accept error");
continue;
}
printf("server:got connection from %s\n",inet_ntoa(cliaddr.sin_addr));
//向客户端写数据
if(write(new_fd,"Hello,Network!\n",14) == -1)
perror("write error!");
close(new_fd);
}
close(sockfd);
return 0;
}
/*client.c*/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#define PORT 8888
#define MAXDATASIZE 5000
int main(int argc,char **argv)
{
int sockfd,nbytes;
char buf[1024];
struct hostent *he;
struct sockaddr_in srvaddr;
if(argc != 2)
{
perror("Usage:client hostname.\n");
exit(1);
}
//函数gethostbyname获得指定域名地址所对应的ip地址
if((he = gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
//创建套接字,返回套接字描述符
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("create socket error");
exit(1);
}
bzero(&srvaddr,sizeof(srvaddr));
//用获得的远程服务器进程的ip地址和端口号来填充一个Internet套接字地址结构
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(PORT);
srvaddr.sin_addr = *((struct in_addr *)he -> h_addr);
//用connect于这个远程服务器建立一个internet连接
if(connect(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr)) == -1)
{
perror("connect error");
exit(1);
}
//调用read函数读取服务器write过来的信息
if((nbytes = read(sockfd,buf,MAXDATASIZE)) == -1)
{
perror("read error");
exit(1);
}
buf[nbytes] = '\0';
printf("read:%s\n",buf);
close(sockfd);
return 0;
}
cc service.c -o service -lsocket
./service
cc client.c -o client -lsocket
./client 127.0.0.1