2.1 Linux C语言编程 -准备工作

    一丶计划                                                    
                                                   2018年1月份计划
第二章 嵌入式Linux 基础 
2.2.1Linux下快速入门Linux C语言编程 
第四章嵌入式Linux应用开发基础

4.5 网络编程 

4.5.1 TCP/IP协议栈 

4.5.2 TCP协议 

4.5.3 UDP协议 

重点:学习关于linux下的C编程
详情书目:http://blog.csdn.net/morixinguan/article/details/71437611


二丶linux网络编程预备知识
socket-->bind-->listen-->accept
简介:Linux下的Socket编程大体上包括Tcp Socket、Udp Socket,TCP和UDP方式的Socket编程用于编写应用层的socket程序,
       是我们用得比较多的
1.常用网络命令
  netstat:用来显示网络的连接,路由表和接口统计等网络的信息
  telnet:用来远程控制的程序,用这个程序来调试我们的服务端程序

2.网络函数描述和实例
  int socket(int domain, int type,int protocol)  
  -->  socket为网络通讯做基本的准备.成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况

  int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
  -->  bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和socket一样

  int listen(int sockfd,int backlog)
  -->  listen函数将bind的文件描述符变为监听套接字.返回的情况和bind一样

  int accept(int sockfd, struct sockaddr *addr,int *addrlen)
  -->  accept调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接. accept成功时返回最后的服
  务器端的文件描述符,这个时候服务器端可以向该描述符写信息了. 失败时返回-1   

  int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
  -->  connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符失败时返回-1
  总的来说网络程序是由两个部分组成的--客户端和服务器端

  注意:send()和recv(),或者write()和read(),或者recvfrom()和sendto(), 用于往/从远程套接字发送和接受数据
 
3.客户端和服务器的建立步骤
  服务器端
  socket-->bind-->listen-->accept
  客户端
  socket-->connect

4.UDP和TCP
TCP Socket
TCP协议提供全双工的通信管道,服务器端和客户端根据协议可以通过read和write的反复调用实现数据的传输
服务器函数:
socket(AF_INET, SOCK_STREAM, 0);
bind(listenfd, (sockaddr *)&servaddr, sizeof(servaddr));
listen(listenfd, 20);
accept(listenfd, (sockaddr *)&cliaddr, &cliaddr_len);
read(connfd, buf, MAXLINE);
write(connfd, buf, count);
close(connfd);
客户端函数:
socket(AF_INET, SOCK_STREAM, 0);
connect(sockfd, (sockaddr *)&servaddr, sizeof(servaddr)))
write(sockfd, MESSAGE, sizeof(MESSAGE));
read(sockfd, buf, MAXLINE);
close(sockfd);
PS:这里需要注意的一下的是sock函数的第二个参数SOCK_STREAM,它表示是一个TCP连接,后面我们会介绍通过传入SOCK_DGRAM打开udp连接。
    服务器端主体流程就是一个死循环,它接受一个socket连接,然后将其原封不动的返回给客户端,待客户端退出后,关闭socket连接,再次接受下一个socket连接。

UDP Socket
由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,实际上有很多保证通讯可靠性的机制需要在应用层实现,可能反而会需要更多代码
服务器函数:
socket(AF_INET, SOCK_DGRAM, 0);
bind(sockfd, (sockaddr *)&servaddr, sizeof(servaddr));
recvfrom(sockfd, buf, MAXLINE, 0, (sockaddr *)&cliaddr, &cliaddr_len);
sendto(sockfd, buf, count, 0, (sockaddr *)&cliaddr, sizeof(cliaddr));
客户端函数:
socket(AF_INET, SOCK_DGRAM, 0);
sendto(sockfd, buf, strlen(buf), 0, (sockaddr *)&servaddr, sizeof(servaddr));
recvfrom(sockfd, buf, MAXLINE, 0, NULL, 0);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值