TCP网络程序设计

一、模型函数化

图片:TCP编程模型

1.1 创建套接字Socket

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

1.2 绑定地址 Bind

图片 地址类型Struct

#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

//通用地址类型
struct sockaddr
{
sa_family_t sa_family;//协议族类型
char sa_data[14];//地址
} // IPV4 地址类型
struct sockaddr_in
{
short int sin_family;
unsigned short int sin_port;//Port
struct in_addr sin_addr; //IP地址 4 bytes int (整数型IP地址)
unsigned char sin_zero[8];//填充??? }
struct in_addr
{
unsigned long s_addr;
}

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

  • 函数inet_addr

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

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

1.4 设置Listen监听端口

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

1.5 等待连接accept

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

1.6 发送数据 send

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

1.7 接收数据 recv

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

1.8 关闭连接 close

1.9 连接服务器 connect

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

二、网络字节序

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

网络字节序转换
//发送方
uint32_t htonl(uint32_t hostlong); //将32位的数据从主机字节序转换为网络字节序(host to)
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位的数据从网络字节序转换为主机字节序
htonl()ntohl()htons()函数的英语全称

htonl()--"Host to Network Long"

ntohl()--"Network to Host Long"

htons()--"Host to Network Short"

ntohs()--"Network to Host Short"

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

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

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

/* tcp_server.c */
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h> #define portnum 2333 int main()
{ int sockfd;
int new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buffer[128];
int nbyte;
int sin_size;
//1.创建套接字
if(sockfd = socket(AF_INET,SOCK_STREAM,0) == -1)
{
printf("Creat socket error!\n");
exit(1);
}
//2.1设置要绑定的地址 bzero(&server_addr,sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET;//IPV4 protocol
server_addr.sin_port = htons(portnum);//port,本地主机字节序——>网络字节序
server_addr.sin_addr.s_addr = htonl (INADDR_ANY); //2.2绑定地址 bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)); //3.监听端口
listen(sockfd,5); while(1)
{
//4.等待连接
sin_size = sizeof(struct sockaddr);
new_fd = accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size); printf("Server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); //5.接收数据
nbyte = recv(new_fd,buffer,128,0);//实际收到的数据字节长度
buffer[nbyte] = '\0';
printf("server received:%s\n",buffer ); //6.结束连接
close(new_fd);
} close(sockfd);
return 0; } /* tcp_client.c */ #include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h> #define portnum 2333
//#define ip_address "192.168.240.133"
int main()
{
int sockfd;
struct sockaddr_in server_addr;
char buffer[128];
//1.创建套接字
if(sockfd = socket(AF_INET,SOCK_STREAM,0) == -1)
{
printf("Creat socket error!\n");
exit(1);
} //2.1设置要连接的服务器的地址 bzero(&server_addr,sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET;//IPV4 protocol
server_addr.sin_port = htons(portnum);//port,本地主机字节序——>网络字节序
server_addr.sin_addr.s_addr = inet_addr("192.168.240.133"); //2.连接服务器
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)) == -1)
{
printf("connect error!\n");
exit(1);
} //3.发送数据到服务器
printf("please input :\n");
fgets(buffer,128,stdin);
send(sockfd,buffer,strlen(buffer),0); //4.关闭连接
close(sockfd);
return 0;
}

【网络编程】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. css实现视觉差的滚动

    之前在逛知乎的时候,发现知乎app首页中偶尔掺杂的广告图片,都是做的视觉差的效果,广告图片的向上速度明显比外面页面的上拉速度慢了很多,看起来很炫酷,然后在网上看了下,发现有很多js插件可以实现这种效果 ...

  2. EntityFramework First,FirstOrDefault,Single,SingleOrDefault的区别

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...

  3. 导出excel设置样式(Aspose.Cells)

    Aspose.Cells.Style style = xlBook.Styles[xlBook.Styles.Add()];style1.Pattern = Aspose.Cells.Backgrou ...

  4. 《The One!团队》第一次作业:团队亮相

    项目 内容 作业所属课程 http://www.cnblogs.com/nwnu-daizh/ 作业要求 https://www.cnblogs.com/nwnu-daizh/p/10687492.h ...

  5. pandas数据清洗

    1.我已安装好Anavonda3.5.所以我只用打开"jupyter notebook",然后打开浏览器 然后点击右侧的“new",然后打开python3

  6. nginx基础学习第二篇:nginx内置变量的使用

    ngx_http_core模块提供的内置变量有很多,常见的有 $uri,用来获取当前请求的uri,不含请求参数. $request_uri,用来获取请求最原始的uri,包含请求参数,且未解码. $re ...

  7. Linux工具安装配置之Oracle

    对于Oracle的安装真的是心生恐惧,特别是一堆堆的依赖包.趁这次DBA在南京,实际操作一番. 两种方式,1.全新安装:2.硬拷贝 全新安装,参考下面这个介绍 http://www.cnblogs.c ...

  8. linux(ubuntu-16.1) 下安装 odoo10 新版

    1.虚拟机(VMware)中安装 ubuntu-16.1(网络适配器选择桥接模式). 安装成功后,运行 ubuntu 提示 "CPU已被客户机操作系统禁用" 时,需要修改配置文件解 ...

  9. Rational Rose2007下载和安装

    网上关于Rational Rose2007安装包,网上找了一堆大多都是垃圾,最后找到一个可用的(带激活文件),保存在自己的网盘里,这里分享出来:https://pan.baidu.com/s/1bpb ...

  10. 入门系列之在Ubuntu上使用Netdata设置实时性能监控

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由小翼 发表于云+社区专栏 介绍 Netdata通过可扩展的Web仪表板提供准确的性能监控,可以显示Linux系统上的流程和服务.它监控 ...