一、SOCKET编程
创建一个传输终端:socket
函数原型:int socket(int domain, int type, int protocol);
头文件:sys/types.h sys/socket.h
成功:返回新的socket文件描述符  失败:-1
domain:协议类型
type:socket类型
protocol:选择特定协议,默认为0.

绑定地址(绑定网卡):bind
函数原型:int bind(int sockfd, cosnt struct sockaddr *addr, socklen_t addrlen);
头文件:sys/types.h sys/socket.h
成功:返回0 失败:-1
sockfd:socket文件描述符
addr:socket的结构地址
addrlen:地址的长度

设置监听:listen
函数原型:int listen(int sockfd, int backlog);
头文件: sys/types.h sys/socket.h
成功:返回0 失败: -1
sockfd:socket文件描述符
backlog:表示高进程所要入队的连接请求数量

等待连接:accept
函数原型: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
头文件: sys/types.h sys/socket.h
成功:返回接受后新的描述符 失败: -1
sockfd:socket文件描述符
addr: socket的结构地址
* addrlen:地址的长度的指针

发送消息:send
函数原型:ssize_t send(int sockfd, const void *buf, size_t len, int flags);
头文件: sys/types.h sys/socket.h
成功:返回发送的数量 失败:-1
sockfd:s socket文件描述符
*buf:需要发送的内容
len:需要发送的长度
flags:发送标识符(不同于write的区别)

连接服务器:connect
函数原型:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
头文件: sys/types.h sys/socket.h
成功:0 失败:-1
sockfd: s socket文件描述符
addr: socket的结构地址
addrlen:地址的长度

二、地址类型

  1. struct sockaddr{
  2. sa_family_t sa_family;       通用的地址,协议族
  3. char sa_data[14];
  4. }

这个用来IPv4地址类型:

  1. struct sockaddr_in{
  2. short int sin_family;
  3. unsigned short int sin_port;
  4. struct in_addr sin_addr;
  5. unsigned char sin_zero[8];
  6. }
  7. struct in_addr{
  8. unsigned long s_addr;
  9. }


三、地址转换
地址转化:inet_addr  将字符串形式的IP地址转化为整数型的IP地址(网络字节序)
函数原型:in_addr_t inet_addr(const char *cp);
头文件:sys/socket.h netinet/in.h  arpa/inet.h
成功:返回0 失败:-1
sockfd:socket文件描述符
addr:socket的结构地址
addrlen:地址的长度

地址转化(反): innet_ntoa
函数原型: char *inet_ntoa(struct in_addr in);
头文件:sys/socket.h netinet/in.h arpa/inet.h
成功:返回字符串 
in:需要转换的in_addr结构的地址

四、网络字节序
如果两台设备进行通信,一台是小端模式的,一台是大端模式的。那么如果没有统一的结构,小端发送的字节序列通过网络发送到大端后,再有大端设备读取出来可能内容有偏差。
网络上传输的都是用大端模式的。

uint32_t htonl(uint32_t hostlong);
将32位的数据从 主机字节序转换为 网络字节序。 in_addr.saddr = htonl(INADDR_ANY)
uint16_t htons(uint16_t hostshort);
将16位的数据从主机字节序转换为网络字节序
uint32_t ntohl(uint32_t netlong);
将32位的数据从网络字节序转换为 主机字 节序
uint16_t ntohs(uint16_t netshort);
将16位的数据从网络字节序转换为 主机字 节序

五、TCP通讯程序设计
tcp_server.c:

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <strings.h>
  5. //#include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #define portnum 3333
  8. int main()
  9. {
  10. int sockfd;
  11. int new_fd;
  12. struct sockaddr_in server_addr;
  13. struct sockaddr_in client_addr;
  14. char buffer[128];
  15. int nbyte = 0;
  16. int sin_size;
  17. /*1.创建socket*/
  18. if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  19. {
  20. printf("create socket error!\n");
  21. exit(1);
  22. }
  23. /*2.1设置要绑定的地址*/
  24. bzero(&server_addr, sizeof(struct sockaddr_in));
  25. server_addr.sin_family = AF_INET;
  26. server_addr.sin_port = htons(portnum);
  27. server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  28. /*2.2.绑定地址*/
  29. bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
  30. /*3.监听端口*/
  31. listen(sockfd, 5);
  32. while(1)
  33. {
  34. /*4.等待链接*/
  35. sin_size = sizeof(struct sockaddr);
  36. new_fd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
  37. if(new_fd == -1)
  38. {
  39. printf("accept socket failed\n");
  40. exit(1);
  41. }
  42. printf("server get connection form %s\n", inet_ntoa(client_addr.sin_addr));
  43. /*5.接收数据*/
  44. nbyte = recv(new_fd, buffer, 128, 0);
  45. buffer[nbyte] = '\0';
  46. printf("server received : %s\n",buffer);
  47. /*6.结束链接*/
  48. close(new_fd);
  49. }
  50. close(sockfd);
  51. return 0;
  52. }

tcp_client:

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. #include <string.h>
  7. #define portnum 3333
  8. int main()
  9. {
  10. struct sockaddr_in server_addr;
  11. int sockfd;
  12. char buffer[128];
  13. /*1.创建socket*/
  14. if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  15. {
  16. printf("create socket error!\n");
  17. exit(1);
  18. }
  19. /*2.1设置要绑定的地址*/
  20. bzero(&server_addr, sizeof(struct sockaddr_in));
  21. server_addr.sin_family = AF_INET;
  22. server_addr.sin_port = htons(portnum);
  23. server_addr.sin_addr.s_addr = inet_addr("192.168.1.110");
  24. /*2.链接服务器*/
  25. if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == -1)
  26. {
  27. printf("connect error!\n");
  28. exit(1);
  29. }
  30. /*3.发送数据到服务器*/
  31. printf("please input char:\n");
  32. fgets(buffer,128,stdin);
  33. send(sockfd, buffer, strlen(buffer), 0);
  34. /*4.结束连接*/
  35. close(sockfd);
  36. }

六、UDP编程练习
udp_server.c:

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <strings.h>
  4. #include <arpa/inet.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #define portnum 3333
  8. #define MSG_SIZE 128
  9. int main()
  10. {
  11. int sockfd;
  12. struct sockaddr_in server_addr;
  13. struct sockaddr_in client_addr;
  14. char buffer[MSG_SIZE];
  15. int addrlen;
  16. int n;
  17. /*创建socket*/
  18. if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  19. {
  20. printf("create socket error!\n");
  21. exit(1);
  22. }
  23. bzero(&server_addr, sizeof(struct sockaddr_in));
  24. server_addr.sin_family = AF_INET;
  25. server_addr.sin_port = htons(portnum);
  26. server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  27. /*绑定地址*/
  28. bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
  29. /*接收数据*/
  30. while(1)
  31. {
  32. addrlen = sizeof(struct sockaddr);
  33. bzero(buffer, MSG_SIZE);
  34. n = recvfrom(sockfd, buffer, MSG_SIZE, 0, (struct sockaddr *)&client_addr, &addrlen);
  35. buffer[n] = '\0';
  36. printf("server received :%s\n", buffer);
  37. }
  38. /*结束连接*/
  39. close(sockfd);
  40. return 0;
  41. }

udp_client.c:

  1. #include <strings.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <strings.h>
  5. #include <stdio.h>
  6. #include <arpa/inet.h>
  7. #define portnum 3333
  8. #define BUF_SIZE 128
  9. int main(int argc, char *argv[])
  10. {
  11. int sockfd;
  12. char buffer[BUF_SIZE];
  13. struct sockaddr_in server_addr;
  14. if(argc != 2)
  15. {
  16. printf("Usage: ./udp_client [ip]\n");
  17. exit(0);
  18. }
  19. /*创建socket*/
  20. if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  21. {
  22. printf("create socket failed!\n");
  23. exit(1);
  24. }
  25. /*发送数据*/
  26. bzero(&server_addr, sizeof(struct sockaddr_in));
  27. server_addr.sin_family = AF_INET;
  28. server_addr.sin_port = htons(portnum);
  29. inet_aton(argv[1], &server_addr.sin_addr);
  30. while(1)
  31. {
  32. printf("Please input char:\n");
  33. fgets(buffer, BUF_SIZE, stdin);
  34. sendto(sockfd, buffer, BUF_SIZE, 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
  35. bzero(buffer, BUF_SIZE);
  36. }
  37. /*结束链接*/
  38. close(sockfd);
  39. }

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

阅读(66) | 评论(0) | 转发(0) |

0

上一篇:Linux网络编程协议

下一篇:vim多行增加缩进

相关热门文章
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • 彻底搞定C语言指针详解-完整版...
给主人留下些什么吧!~~
评论热议

TCP/UDP socket编程学习相关推荐

  1. Java TCP/UDP socket 编程流程总结

    最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就 ...

  2. python(18):网络编程(七层协议+tcp/udp+socket编程)

    Python作为最热门的语言,使我们每个人应该学习的一门技术! 本文针对初学者,我会用最容易的方式告诉你如何入门python! 一.基本网络概念 1.计算机之间如何进行联机 早期: 以太网:局域网与交 ...

  3. tcp/udp socket编程异同

    一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UDP不保证 ...

  4. UDP socket 编程学习笔记

    UDP编程的基本流程 UDP是无连接.不可靠的数据报协议,不同于TCP的面向连接的可靠数据流.UDP编程常见的应用包括:DNS域名服务器.NFS网络文件系统.SNMP简单网络管理协议. 客户端不必与服 ...

  5. Linux Kernel TCP/IP Stack — Socket Layer — TCP/UDP Socket 网络编程

    目录 文章目录 目录 TCP/UDP Socket 逻辑架构 创建 Socket 绑定 Socket 请求建立 Socket 连接 监听 Socket 接受请求 关闭连接 数据的发送和接收 send ...

  6. socket编程学习(addr设置)

    sockaddr结构体 struct  sockaddr{ sa_family_t  sa_family; //地址族,最常用的是"AF_INET"(IPV4)和"AF_ ...

  7. Socket编程学习-基础操作

    Socket编程学习-基础操作 socket的基本操作 可参考,https://blog.csdn.net/sinat_36645384/article/details/79128137 核心问题1- ...

  8. TCP/UDP,SOCKET,HTTP,FTP协议简析

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  9. linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家

    Linux UDP socket编程(UDP通讯模型): UDPClient + UDPService. Linux下大多数网络程序都是基于TCP的,很少基于UDP,简单的通讯模型如下,开发时候备用! ...

  10. Java TCP/IP Socket 编程 笔记

    http://jimmee.iteye.com/blog/617110 http://jimmee.iteye.com/category/93740 Java TCP/IP Socket 编程 笔记( ...

最新文章

  1. 键盘谍影 键盘监视器的原理和防范
  2. 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
  3. 图解WordPress主题(模板)架构
  4. django中csrftoken跨站请求伪造的几种方式
  5. 修改Static控件的字体颜色
  6. chartjs和echartsjs库简介
  7. 代理服务器反向代理varnish配置文件解析
  8. 7.这就是搜索引擎:核心技术详解 --- 云存储与云计算
  9. java虚拟机之内存模型
  10. STM32F4开发-新建工程
  11. 交叉编译工具arm-linux-gccarm-elf-gcc下载地址全集
  12. 米谟科技 3D音频VR编辑器——sound flare声弹是什么
  13. URL.createObjectURL()
  14. 如何实现thead固定不动,tbody出现垂直滚动条
  15. Aurelia历险记:创建自定义PDF查看器
  16. 电脑开机时stage 1 fo 3 stage 2 fo 3 Checking file system on D:
  17. lisp常用函数-颜麓
  18. Adobe CC 2019
  19. 高数中dy和Δy有什么区别
  20. nz-date-picker组件时间范围限制

热门文章

  1. UVa12080 Pesky Heroes
  2. RPMS_4s汽车维修管理
  3. OpenXLSX的安装与使用(macOS-c++)
  4. Python+Anaconda+Qt5安装教程
  5. java五子棋源代码_五子棋游戏源代码 - javaAPI的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. [ACdream]女神教你字符串——违和感
  7. 【2016ACM/ICPC亚洲区大连站A】HDU - 5971 Wrestling Match 二分图染色
  8. 牵手华为、百信,深度操作系统助力太行终端落地山西
  9. Aigtek功率放大器在压电双晶片动力学研究中的应用
  10. android bootload漏洞,利用漏洞解锁锤子T1/2手机的bootloader