由于实验室的要求最近开始学习unix网络编程的相关知识,为了更好的理解unix网络编程的一些基本的函数的应用,所以写了一个很简单的程序包括客户端和服务器端。同时也总结出服务器端和客户端执行的相关流程。程序如下:
/*************client.c*******************/
# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <netdb.h>
# include <stdio.h>
int main(int argc,char **argv)
{
int sockfd,n;
char recvline[100];
struct sockaddr_in servaddr;
struct hostcnt *h;
if(argc!=2)
{
printf("usage:a.out <ipaddress>");
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("socket error!");
}
bzero(&servaddr,sizeof(servaddr));//把相应的结构体清0
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(1032);//把数值转换成网络字节值
if((inet_pton(AF_INET,argv[1],&(servaddr.sin_addr)))<0)
{//把字符串型的形式转换成地址的格式
printf("address error!\n");
}
//建立与服务器的链接
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
{
printf("connect error!\n");
}
while ( (n = read(sockfd, recvline, 1024)) > 0) {
recvline[n] = 0;/* null terminate */
if (fputs(recvline, stdout) == EOF)
printf("fputs error!\n");
}
if (n < 0)
printf("read error!\n");
return 0;
}
注意执行客户端的时候使用的命令比如:./client 127.0.0.1(这个ip地址必须要在文件/etc/hosts文件中定义的才可以链接成功)
/***********server.c****************/
# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <netdb.h>
# include <stdio.h>
int main(int argc,char **argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[1024];
listenfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(1032);//这是服务器常用的端口
bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
listen(listenfd,5);
for(;;)
{
printf("请输入要传送的信息:\n");
scanf("%s",buff);
connfd=accept(listenfd,(struct sockaddr *)NULL,NULL);
write(connfd,buff,strlen(buff));
close(connfd);
}
}
执行的简单过程就是:首先编译这两个。c文件,然后开两个终端,一个作为客户端一个作为服务器端。在客户端输入的格式如上面所示,而服务器端的话就在相应的目录执行编译后的程序就可以了。
总结客户端和服务器端执行的大致过程:
/**************客户端***************/
(1)用socket函数获取Socket Descriptor
(2)对套接口地址结构进行赋值
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(1032);
以及设置ip地址
(3)connect函数建立与服务器的链接
(4)接收或者发送数据
用write()函数来发送数据
read()函数来接收数据
(5)关闭Socket
/**************服务器端****************/
(1)用socket函数获取Socket Descriptor
(2)对套接口地址结构进行赋值
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(1032);
(3)用bind()函数来把一个本地地址赋予一个套接口
(4)调用listen()函数实现监听机制
(5)调用accept()函数建立实现与客户端的通信
(6)与客户端进行收发信息(主要涉及到write()函数和read()函数)