【服务器程序和注释】
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3490
#define BACKLOG 10
main()
{
//设定端口为 3490
int sockfd,new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
exit(1);
perror("socket");
}
//服务器网络地址结构体
//客户端网络地址结构体
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
//设置为 IP 通信
//服务器端口号
//服务器 IP 地址--允许连接到所有
本地地址上
bzero(&(my_addr.sin_zero),8);
//置零
perror("bind");
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
exit(1);
if(listen(sockfd,BACKLOG)==-1){perror("listen");exit(1);}
}
sin_size=sizeof(struct sockaddr_in);
while(1)
{
if((new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size))==-1)
//这里使用的函数是阻塞型的,没有连接时程序不会继续运行
{perror("accept");continue;}
printf("server:got connection from %s\n", inet_ntoa(their_addr.sin_addr));
if(!fork())
//转化 IP 地址并输出
{if(send(new_fd,"This is my First Program in lunix!\n
zhu
hao\n",53,0)==-1)perror("send");
//传送数据信息
close(new_fd);
exit(0);
}
1 / 3
close(new_fd);
}
}
【客户端程序及注释】
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 3490
#define MAXDATASIZE 100
int main(int argc, char *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr;
// Server 的端口
//一次可以读的最大字节数
//提取输入的主机名称的字符数,并用
//(接上)针数组指向该主机名(IP 地址)
// 主机信息
//对方地址信息
//获得主机信息
//如果输入格式不正确,则说明
//用法是输入主机地址
if (argc!=2) {
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) {
herror("gethostbyname");
exit(1);
}
if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT); /* short, NBO */
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8);
if(connect(sockfd,(struct sockaddr *)&their_addr, sizeof(struct sockaddr))==-1)
//其余部分设成 0
//设置为 IP 通信
//设置服务器端口号
{perror("connect");exit(1);}
if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)
//接受数服务器据
2 / 3
{perror("recv");
exit(1);}
buf[numbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
return 0;
}
//输出接收到的数据
//结束
3 / 3