tcp 网络编程
网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信。
OSI:开放式系统互联
OSI 7层模型: 4层模型
1.应用层:talnet tftp等
2.表示层: 应用层
3.会话层
4.传输层:tcp,udp等,可靠不可靠 传输层
5.网络层:ip,负责把数据发送到另一台电脑 网络层
6.数据链路层
7.物理层:ARP,RARP等,负责二进制的数据转化成光信号。 网络接口和物理层
发送数据,7层模型从上到下,接收数据从下到上。
层与层之间是透明的,互不关心对方的动作(每层都有固定的动作,称之为协议)。
udp和tcp之间的关系:
相同点:都为传输层协议
不同点:udp:面向不连接,不可靠。tcp:面向连接,可靠。发送数据包后,未收到成功接收的应答,将会对数据包重新发送 。而udp不存在这种情况。
socket的四个特点:
1.它是一种特殊的I/O接口
2.它是一种特殊的文件描述符
3.它有两个缓冲区:读缓冲区和写缓冲区。
4.有三种不同的类型:SOCKET_STREAM(流式套接字),SOCKET_DGRAM(数据报套接字),SOCKET_RAM(原始套接字)
大端存储和小端存储(高字节存放于高地址,大端相反)。
字节序转换:
uint16_t htons(uint16_t hostshort); //将主机端口号转换成二进制大端存储。
ip地址转换:
int inet_aton(const char *cp, struct in_addr *inp); //将字符串IP地址转换为二进制,并将其大端存储在struct in_addr *inp的地址成员中
in_addr_t inet_addr(const char *cp);//将字符串ip地址转换为二进制,函数返回地址存放于struct in_addr *inp 的地址成员中。
socket里面的独一无二的port;
几个关于地址的重要的结构体:
struct sockaddr
{
u_short sa_family;
char sa_data[14];
}
struct sockaddr_in
{
u_short sin_family;
u_short sin_sin_port;
struct in_addr sin_addr;
char sin_zero[8];
}
struct in_addr
{
in_addr_t s_addr;
};
tcp服务器端编程:一个简单的即时通信程序
#include<stdio.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<pthread.h>
#include<strings.h>
int newsocketfd;
void *func(void*p)
{ char buf[];
while(strncmp(buf,"bye",))
{
bzero(buf,);
if(recv(newsocketfd,buf,sizeof(buf),)<)//接收数据函数
perror("recv() error!\n");
printf("%s\n",buf);
} }
int main()
{
int socketfd = socket(PF_INET,SOCK_STREAM,);//创建套接字,第一参数为地址族,第二个参数为socket类型,、、、、、、第1步
struct sockaddr_in saddr;//使用这个结构体需要加上<netinet/in.h>这个头文件
memset(&saddr,,sizeof(saddr));
saddr.sin_family = PF_INET;对结构体初始化
saddr.sin_port = htons();//需要转换成大端存储
saddr.sin_addr.s_addr = inet_addr("192.168.1.46");//同上,改地址为客户端地址 if(bind(socketfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr_in))<)//、、、、、、第二步,绑定端口
perror("bind() error!\n"); if(listen(socketfd,)<)//、、、、第三步,侦听是否有连接请求,5表示同一时间只能接受5个连接请求。未处理的连接请求将会放到请求队列中(最多5个)
perror("listen() error!\n");
struct sockaddr_in caddr;
int s = sizeof(struct sockaddr);
newsocketfd = accept(socketfd,(struct sockaddr*)&caddr,&s);//第四步,处理请求,会得到客户端的ip地址和端口,然后返回一个和客户端相同的newsockfd(文件描述符)服务器通过这个与客户端通信。 pthread_t pthreadid;
pthread_create(&pthreadid,NULL,func,NULL); char buf[];
while(strncmp(buf,"bye",))
{
bzero(buf,);
scanf("%s",buf);
if(send(newsocketfd,buf,strlen(buf),)<)//、、、、、、第五步发送数据。
perror("send() error!\n");
}
close(socketfd);//、、、、、、、、、、、、、、、、第六步,关闭文件描述符
close(newsocketfd); } 客户端程序: #include<stdio.h>
#include<pthread.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>
#include <sys/types.h>
#include <sys/socket.h>
int socketfd;
void *func(void*p)
{
char buf[];
while(strncmp(buf,"bye",))
{
bzero(buf,);
int nrecv;
if(nrecv = recv(socketfd,buf,sizeof(buf),)<)
perror("recv() error!\n");
printf("%s\n",buf); } }
int main()
{
socketfd = socket(PF_INET,SOCK_STREAM,);//、、、、、、、、、、、、、第一步创建套接字
struct sockaddr_in saddr;
memset(&saddr,,sizeof(saddr));
saddr.sin_family = PF_INET;
saddr.sin_port = htons();//编程可用端口4000-600000
saddr.sin_addr.s_addr = inet_addr("192.168.1.46");//该地址为服务器端地址 if(connect(socketfd,(struct sockaddr *)&saddr,sizeof(struct sockaddr))<)//、、、、、、、、、、第二步发送连接请求 perror("connect() error!\n");
pthread_t pthreadid;
pthread_create(&pthreadid,NULL,func,NULL);
char buf[];
while(strncmp(buf,"bye",))
{
bzero(buf,);
scanf("%s",buf);
if(send(socketfd,buf,strlen(buf),)<)//、、、、、、、、、、、第三步读写数据
perror("send() error!\n");
}
close(socketfd);//、、、、、、、、、、、、、、、第四步,关闭文件描述符。 }
tcp 网络编程的更多相关文章
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- 简述TCP网络编程本质
基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- TCP网络编程
TCP网络编程 与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /** * @param args * @th ...
- Java - TCP网络编程
Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...
- 8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...
- TCP网络编程小结
一.套接字编程基础 1.套接字地址结构 通用的地址结构是 struct sockaddr{ unsigned short sa_family; ]; } IPv4的套接字地址结构是 struct in ...
- 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...
随机推荐
- 用adb命令查看apk版本
adb devices (显示连接的设备) adb root (获取手机root权限) adb remount (重新挂载系统分区,使系统分区重新可写) adb shell (进入目标设备的L ...
- dede首页调用分类信息
格兰斯-与你共同开创门窗定制5G时代 5G战略--明确的,没有歧义的明亮奥尼克斯的观点与追求 {dede:channelartlist row=1} {dede:arclistsg r ...
- php通过ini_set调用output_compression压缩网页
网页压缩是一种网页优化技术,可以让网页体积缩小后再传输到客户端,从而减少数据传送量,提高速度.这种技术现在使用已经相当普遍,绝大多数网页都使用了这种技术. 网页压缩可以在服务器或空间里通过参数设置启用 ...
- sqlite3使用事务处理[zz]
<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-al ...
- 【开发技术】eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法
要格式化代码的时候,右键-source-format能够起效,但ctrl+shift+f不好使了. 原来是和“简繁体快捷键”冲突了.输入法中的这个快捷键我们一般不用,小勾勾去掉就成了. eclipse ...
- -------- Rootkit 核心技术——利用 nt!_MDL 突破 KiServiceTable 的只读访问限制 Part II --------
------------------------------------------------------------------------------------------- 本篇开始进入正题 ...
- Servlet--继承HttpServlet写自己的Servlet
前面2篇关注的都是Servlet接口,在实际编码中一般不直接实现这个接口,而是继承HttpServlet类.因为j2e的包里面写好了GenericServlet和HttpServlet类来让我们简化编 ...
- 无废话XML--DOM4J
Dom4j 是一个易用的.开源的库,用于 XML ,XPath 和 XSLT .它应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM ,SAX 和 和 JAXP .我们可以很 ...
- android 页面的切换
startActivity后加:IntentHelper.jump(mContext, MyBalanceActivity.class);activity.overridePendingTransit ...
- Spring ioc,aop的理解
什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容器控制程序之间的关系,而不是由代码直接控制 由于控制权由代码转向了容器,所以称为反转 依赖注入,作用是避免手工在各代 ...