unix网络编程的一个简单例子总结

由于实验室的要求最近开始学习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()函数)


   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值