TCP网络程序设计

一、模型函数化

图片:TCP编程模型

1.1 创建套接字Socket

  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>
  3. int socket(int domain, int type, int protocol);

1.2 绑定地址 Bind

图片 地址类型Struct

  1. #include <sys/socket.h>
  2. int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
  3. //通用地址类型
  4. struct sockaddr
  5. {
  6. sa_family_t sa_family;//协议族类型
  7. char sa_data[14];//地址
  8. }
  9. // IPV4 地址类型
  10. struct sockaddr_in
  11. {
  12. short int sin_family;
  13. unsigned short int sin_port;//Port
  14. struct in_addr sin_addr; //IP地址 4 bytes int (整数型IP地址)
  15. unsigned char sin_zero[8];//填充???
  16. }
  17. struct in_addr
  18. {
  19. unsigned long s_addr;
  20. }

1.3 地址转换(网络字节序——整数型)

  • 函数inet_addr

    in_addr_t inet_addr(const char *cp)
功能:将字符串形式的IP地址转化为整数型的IP地址(网络字节序)
  1. 范例: in_addr.saddr = inet_addr(“192.168.1.1 );
  • 函数inet_ntoa

    char *inet_ntoa (struct in_addr)
功能:将整数形式的IP地址转化为字符串形式的IP地址

1.4 设置Listen监听端口

  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>
  3. int listen(int sockfd, int backlog);

1.5 等待连接accept

  1. //无客户机连接时,服务器阻塞
  2. #include <sys/socket.h>
  3. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

1.6 发送数据 send

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. ssize_t send(int sockfd, const void *buf, size_t len, int flags);

1.7 接收数据 recv

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. ssize_t recv(int sockfd, void *buf, size_t len, int flags);

1.8 关闭连接 close

1.9 连接服务器 connect

  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>
  3. int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

二、网络字节序

  • 网络字节序 —— 大端模式
图片 网络字节序转换

网络字节序转换
  1. //发送方
  2. uint32_t htonl(uint32_t hostlong); //将32位的数据从主机字节序转换为网络字节序(host to)
  3. in_addr.saddr = htonl(INADDR_ANY)
  4. uint16_t htons(uint16_t hostshort); //将16位的数据从主机字节序转换为网络字节序
  5. //接收方
  6. uint32_t ntohl(uint32_t netlong); //将32位的数据从网络字节序转换为主机字节序
  7. uint16_t ntohs(uint16_t netshort); //将16位的数据从网络字节序转换为主机字节序
htonl()ntohl()htons()函数的英语全称

htonl()--"Host to Network Long"

ntohl()--"Network to Host Long"

htons()--"Host to Network Short"

ntohs()--"Network to Host Short"

以上函数是为了解决大小端不一致导致数据传送错误的问题

吐槽:
  1. 如果给出了一些函数的全称其实很好理解,可惜国内许多翻译人还是作者不知道是严重高估了读者的英语水平还是刻意的,翻译或者编写的东西莫名奇妙.
  2. 两大重灾区:计算机书籍 编程语言书籍(特别特别是汇编语言)非得逼人读原著.

三、编程实例——TCP通讯程序设计

  1. /* tcp_server.c */
  2. #include <stdio.h>
  3. #include <sys/socket.h>
  4. #include <string.h>
  5. #include <netinet/in.h>
  6. #define portnum 2333
  7. int main()
  8. {
  9. int sockfd;
  10. int new_fd;
  11. struct sockaddr_in server_addr;
  12. struct sockaddr_in client_addr;
  13. char buffer[128];
  14. int nbyte;
  15. int sin_size;
  16. //1.创建套接字
  17. if(sockfd = socket(AF_INET,SOCK_STREAM,0) == -1)
  18. {
  19. printf("Creat socket error!\n");
  20. exit(1);
  21. }
  22. //2.1设置要绑定的地址
  23. bzero(&server_addr,sizeof(struct sockaddr_in));//清零
  24. server_addr.sin_family = AF_INET;//IPV4 protocol
  25. server_addr.sin_port = htons(portnum);//port,本地主机字节序——>网络字节序
  26. server_addr.sin_addr.s_addr = htonl (INADDR_ANY);
  27. //2.2绑定地址
  28. bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));
  29. //3.监听端口
  30. listen(sockfd,5);
  31. while(1)
  32. {
  33. //4.等待连接
  34. sin_size = sizeof(struct sockaddr);
  35. new_fd = accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);
  36. printf("Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
  37. //5.接收数据
  38. nbyte = recv(new_fd,buffer,128,0);//实际收到的数据字节长度
  39. buffer[nbyte] = '\0';
  40. printf("server received:%s\n",buffer );
  41. //6.结束连接
  42. close(new_fd);
  43. }
  44. close(sockfd);
  45. return 0;
  46. }
  47. /* tcp_client.c */
  48. #include <stdio.h>
  49. #include <sys/socket.h>
  50. #include <string.h>
  51. #include <netinet/in.h>
  52. #define portnum 2333
  53. //#define ip_address "192.168.240.133"
  54. int main()
  55. {
  56. int sockfd;
  57. struct sockaddr_in server_addr;
  58. char buffer[128];
  59. //1.创建套接字
  60. if(sockfd = socket(AF_INET,SOCK_STREAM,0) == -1)
  61. {
  62. printf("Creat socket error!\n");
  63. exit(1);
  64. }
  65. //2.1设置要连接的服务器的地址
  66. bzero(&server_addr,sizeof(struct sockaddr_in));//清零
  67. server_addr.sin_family = AF_INET;//IPV4 protocol
  68. server_addr.sin_port = htons(portnum);//port,本地主机字节序——>网络字节序
  69. server_addr.sin_addr.s_addr = inet_addr("192.168.240.133");
  70. //2.连接服务器
  71. if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)) == -1)
  72. {
  73. printf("connect error!\n");
  74. exit(1);
  75. }
  76. //3.发送数据到服务器
  77. printf("please input :\n");
  78. fgets(buffer,128,stdin);
  79. send(sockfd,buffer,strlen(buffer),0);
  80. //4.关闭连接
  81. close(sockfd);
  82. return 0;
  83. }

【网络编程】TCP网络编程的更多相关文章

  1. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

  2. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  3. GO语言练习:网络编程 TCP 示例

    1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 package main import ( "net" "os" &qu ...

  4. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  5. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

  6. C#网络程序设计(3)网络传输编程之TCP编程

        网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程.     (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议,它提供全双工和可 ...

  7. 简述TCP网络编程本质

    基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...

  8. tcp 网络编程

    网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信. OSI:开放式系统互联 OSI 7层模型:                                               ...

  9. UNIX网络编程——解决TCP网络传输“粘包”问题

    当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...

  10. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

随机推荐

  1. MySql安装错误代码1045的解决方案

    1.MySql安装错误代码1045的解决方案 2.root密码忘记1045的解决方案 错误代码 1045 Access denied for user 'root'@'localhost' (usin ...

  2. Codeforces - 24D 有后效性的DP处理

    题意:在n*m的网格中,某个物体初始置于点(x,y),每一步行动都会等概率地停留在原地/往左/往右/往下走,求走到最后一行的的步数的数学期望,其中n,m<1000 lyd告诉我们这种题目要倒推处 ...

  3. 20190430-Bootstrapの组件

    写在前面的乱七八糟:今天务必要把BT盘完~任重道远~ 目录 1.字体图标 2.下拉菜单 3.按钮组 4.输入框组 5.导航 5.1标签页 5.2胶囊式标签页 5.3路径导航/面包屑导航 6.导航条 7 ...

  4. Linux - 组管理和权限管理

    l Linux组基本介绍 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念. 1) 所有者 2) 所在组 3) 其它组 4) 改变用户所在的 ...

  5. EasyNetQ自定义异常消息处理

    20140310补充: rabbitmq有requeue属性,可以选择消息是否返回队列,另,本文的解决方式非常之山寨,只能应用于发送和接收方式. 这几天在折腾消息队列,在.Net环境下有基于Rabbi ...

  6. selenium+python(模块化驱动测试)

    模块化驱动测试,就是借鉴编程语言中模块化的思想,把重复的操作独立成功公告模块,懂用例执行过程中需要用到这一模块操作时则被调用,这样可以极大的消除重复从而提高测试用例的可维护性 下面具体以126邮箱为例 ...

  7. PHP的file_get_contents()方法,将整个文件读入字符串中

    <?php $post_data = file_get_contents("e:\\1.txt"); echo $post_data; ?> 更多信息看这里:http: ...

  8. CCF 出现次数最多的数 201312-1

    出现次数最多的数 问题描述 试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个正整数,找出它们中出现次数最多的 ...

  9. iOS 开发工具网页下载

    iOS 开发工具网页下载地址: https://developer.apple.com/downloads/

  10. 周记5——随机撒花特效、动态修改伪元素样式、contenteditable属性、手机端调试利器VConsole、浏览器端debug调试

    记录一些小零碎知识点,以便日后查看~ 1.随机撒花特效 教师节快到了,公司的产品提出一个需求:在IM(即时聊天)聊天界面弹出教师节的祝福“广告”,用户点击“发送祝福”按钮,聊天界面会随机撒花.这里的重 ...