【网络编程】TCP网络编程
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网络编程的更多相关文章
- C++网络套接字编程TCP和UDP实例
		原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ... 
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
		一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ... 
- GO语言练习:网络编程 TCP 示例
		1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 package main import ( "net" "os" &qu ... 
- JAVA TCP网络编程学习笔记
		一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ... 
- 网络编程TCP协议-聊天室
		网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ... 
- C#网络程序设计(3)网络传输编程之TCP编程
		网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程. (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议,它提供全双工和可 ... 
- 简述TCP网络编程本质
		基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ... 
- tcp 网络编程
		网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信. OSI:开放式系统互联 OSI 7层模型: ... 
- UNIX网络编程——解决TCP网络传输“粘包”问题
		当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ... 
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
		[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ... 
随机推荐
- RSAUtils非对称加密
			import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Bas ... 
- 数组去重 && 快速排序 && 数组中重复元素最多的 && 深拷贝
			var arr0 = [1,3,3,3,4,4,4,4,5,5]; var arr1 = [10,9,2,5,7,34,65,48,90,103]; var newArr=[]; /* for(var ... 
- PIE_SDK.NET功能表
- [大数据入门]实战练习  安装Cloudera-Hadoop集群
			实验环境规划 Hostname IP OS Roles Machine 0 elephant 192.168.124.131 Machine 1 tiger 192.168.124.132 ... 
- 高效的JS数组操作
			1.向数组的末尾添加元素 var arr=[1,2,3]; arr[arr.length]=1; 2.向数组的头部添加元素 var arr=[1,2,3]; [0].concat(arr); 3.向数 ... 
- spring-boot启动后在浏览器打开指定页面
			来自:https://stackoverflow.com/questions/27378292/launch-browser-automatically-after-spring-boot-webap ... 
- 存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20
			存储器的保护(三) 修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响).要求:对内存的读写按双字的长度进行,并在检测的同时显示已检测的内存数量 ... 
- 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17
			(十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 ... 
- 九度oj 1001 A+B for Matrices 2011年浙江大学计算机及软件工程研究生机试真题
			题目1001:A+B for Matrices 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15235 解决:6172 题目描述: This time, you are supposed ... 
- <数据挖掘导论>读书笔记7 Apriori算法
			Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法.其核心是基于两阶段频集思想的递推算法.该关联规则在分类上属于单维.单层.布尔关联规则.在这里,所有支持度大于最小支持度的项集称为频繁项 ... 
