在TCP协议下的数据传送
本人小白菜逼一枚,,,,刚建立博客,也写不了太深入的,就写点上课的笔记什么的。有错误希望广大博友指出,我一定虚心学习接收改正。
我的新浪邮箱:liudaohui0805@sina.com
我的QQ邮箱:1019089094@qq.com
计算机网络部分今天主讲的tcp和udp协议,这两协议都是数据链路层下的重要协议,说其重要原因是因为在数据间传送时
TCP安全可靠,不丢包,面向连接,三次握手,四次挥手,效率低;
UDP数据传输速度快,面向无连接类型;
其次讲了端口号:端口号分三类,第一类,知名端口:是被注册的端口柏阔http80端口,范围是0~1023;
什么是http80端口:80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议开放的,此为上网冲浪使用次数最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议。可以通过HTTP地址(即常说的“网址”)加“:80”来访问网站,因为浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“:80”了。
第二类,动态端口:供本机使用的端口越好,即系统随机分配,范围是1024~5000
第三类,保留端口:为服务器保留的专有端口号。 范围是 5000~65535
还有Listen:
载波监听多点接入/碰撞检测
CSMA/CD 表示 Carrier Sense Multiple Access with Collision Detection。
“多点接入”表示许多计算机以多点接入的方式连接在一根总线上。
“载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。
总线上并没有什么“载波”。因此, “载波监听”就是用电子技术检测总线上有没有其他计算机发送的数据信号。
碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”
每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送。
改变Socket属性:
属性分为 阻 塞:默认状态下是阻塞状态
非阻塞:u_long mode = 1;ioetlsocket(socket的名字,FIONBIO,地址&mode);
函数原型 int ioctlsocket(
_In_ SOCKET s,
_In_ long cmd,
_Inout_ u_long *argp
);
cout<<"------------------------------------------------------------------------------------------"<<endl;
重点来了:针对本阶段的学习方向,在家中和在教室使用的ip不同,每次应该记得更换ip地址
使用TCP通信和UDP通信 的实现过程不同,作为初学者应该仔细斟酌,
之后会对两种通信方式的差异进行详细的分析和区别,进行理解。
cout<<"------------------------------------------------------------------------------------------"<<endl;
服务端就是接收端
服务端的代码
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <fstream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
class FileInfo
{
public:
void SetFileName(char *szname)
{
strcpy_s(m_szfilename,MAX_PATH,szname);
}
char *GetFileName()
{
return m_szfilename;
}
void SetFileSize(DWORD dwfilesize)
{
m_dwfilesize = dwfilesize;
}
DWORD GetFileSize()
{
return m_dwfilesize;
}
private:
char m_szfilename[MAX_PATH];
DWORD m_dwfilesize;
};
int main()
{
//1,加载库;
WORD wVersionRequested;
WSADATA wsaData;
int err;
SOCKET socketserver ;
SOCKET socketwaiter ;
try
{
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
throw err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
throw 2;
}
else
printf("The Winsock 2.2 dll was found okay\n");
//2,创建套接字
socketserver = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP );
if (socketserver == INVALID_SOCKET )
{
throw "Create Failed";
}
//3,绑定
sockaddr_in sockaddrserver;
sockaddrserver.sin_family = AF_INET;//地址族
sockaddrserver.sin_addr.s_addr= inet_addr("192.168.1.114");
sockaddrserver.sin_port = htons(1234);
if (SOCKET_ERROR
== bind(socketserver,(const sockaddr*)&sockaddrserver,sizeof(sockaddr_in) ))
{
int n = GetLastError();
throw "Bind Faild";
}
//4,监听
if (SOCKET_ERROR == listen(socketserver,10))//队列的最大长度10
{
throw "Listen Faild";
}
//5,接收
sockaddr_in addrclient;
int nsize = sizeof(addrclient);
cout<<"sssssssssssss"<<endl;
socketwaiter = accept(socketserver,(sockaddr*)&addrclient,&nsize);
if (INVALID_SOCKET == socketwaiter)
{
int n = GetLastError();
throw "Accept Failed";
}
//接收文件头
FileInfo fi;
//接收文件头
recv(socketwaiter,(char *)&fi,sizeof FileInfo,0);
char szpath[MAX_PATH] = "E:\\";
strcat_s(szpath,MAX_PATH,fi.GetFileName());
//创建文件
fstream fs;
fs.open(szpath,fstream::out|fstream::binary|fstream::trunc);
if (!fs)
{
throw "sdasdasdada";
}
char szbuf[4*1024] = {0};
//接收文件内容
int filesize = fi.GetFileSize();
while (filesize)
{
int nrelRecvNum = recv(socketwaiter,szbuf,sizeof(szbuf),0);
if (nrelRecvNum > 0)
{
filesize -= nrelRecvNum;
fs.write(szbuf,nrelRecvNum);
}
}
fs.close();
}
catch(int nerror)
{
switch (nerror)
{
case 1:
break;
}
return 0;
}
catch( char *szname)
{
cout<<endl;
cout<<"傻逼了吧"<<endl;
WSACleanup();
if (socketserver)
{
closesocket(socketserver);
socketserver = NULL;
}
return 0;
}
closesocket(socketserver);
closesocket(socketwaiter);
WSACleanup();
system("pause");
return 0;
}
客户端就是发送端:
客户端代码:
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <fstream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
class FileInfo
{
public:
void SetFileName(char *szname)
{
strcpy_s(m_szfilename,MAX_PATH,szname);
}
char *GetFileName()
{
return m_szfilename;
}
void SetFileSize(DWORD dwfilesize)
{
m_dwfilesize = dwfilesize;
}
DWORD GetFileSize()
{
return m_dwfilesize;
}
private:
char m_szfilename[MAX_PATH];
DWORD m_dwfilesize;
};
int main()
{
//1,加载库;
WORD wVersionRequested;
WSADATA wsaData;
int err;
SOCKET socketclient;
try
{
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
throw err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
throw 2;
}
else
printf("The Winsock 2.2 dll was found okay\n");
//2,创建套接字
socketclient = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP);
if (socketclient == INVALID_SOCKET )
{
throw "Create Failed";
}
//3.
sockaddr_in addrock;
addrock.sin_family = AF_INET;
addrock.sin_addr.s_addr= inet_addr("192.168.1.114");
addrock.sin_port = htons(1234);
//创建socket
if (SOCKET_ERROR == connect(socketclient,(sockaddr *)&addrock,sizeof(addrock)))
{
throw "sdada";
}
//获得文件头信息
char szfilename[MAX_PATH] = "C:\\Users\\Public\\Pictures\\Sample Pictures\\benbenla-07c.jpg";
fstream fs;
fs.open(szfilename,fstream::binary|fstream::in);
if (!fs)
{
throw "ssss";
}
fs.seekg(0,fstream::end);
int nfilesize = fs.tellg();
fs.seekg(0,fstream::beg);
//文件信息
FileInfo fi;
fi.SetFileName("benbenla-07c.jpg");
fi.SetFileSize(nfilesize);
//发送文件头
send(socketclient,(char *)&fi,sizeof FileInfo,0);
//获得文件的内容
char szbuf[4*1024] = {0};
//发送文件内容
while (1)
{
fs.read(szbuf,4096);//一次读4096
int nRelReadNum = fs.gcount();//获得当前字节数
if (nRelReadNum == 0)
{
break;
}
int n = send(socketclient,szbuf,nRelReadNum,0);
}
fs.close();
}
catch(int nerror)
{
switch (nerror)
{
case 1:
break;
}
return 0;
}
catch( char *szname)
{
WSACleanup();
if (socketclient)
{
closesocket(socketclient);
socketclient = NULL;
}
return 0;
}
closesocket(socketclient);
//6,卸载库
WSACleanup( );
system("pause");
return 0;
}
在TCP协议下的数据传送的更多相关文章
- TCP协议下大数据传输IOCP乱序问题
毕业后稀里糊涂的闭门造车了两年,自己的独立博客也写了两年,各种乱七八糟,最近准备把自己博客废了,现在来看了下这两年写的对我来说略微有点意义的文章只此一篇,转载过来以作留念. 写的很肤浅且凌乱,请见谅. ...
- TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q
TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q 一.TCP协议下的服务端并发 ''' 将不同的功能尽量拆分成不同的函数,拆分出来的功能可以被多个地方使用 TCP服务 ...
- tcp协议下的Socket
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net ...
- 网络编程--使用TCP协议发送接收数据
package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...
- TCP协议下Socket的基础编程类型
套接字的基本操作有: 创建(socket).命名(bind).侦听(listen).连接(accept).关闭(shutdown).发送(send).接受(recv). 下面逐个分析: 一.创建(so ...
- 《java入门第一季》之tcp协议下的网络编程
tcp协议相对于udp更加安全. 首先看一下需求:服务器端开启,多个客户端同时向服务器发送数据,看哪个客户端先到达. 说明:这里我开启三个电脑实验,一台电脑写服务器端的程序,两台电脑开客户端的程序.服 ...
- 基于tcp协议下粘包现象和解决方案,socketserver
一.缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送 ...
- 《java入门第一季》之tcp协议下的编程实现键盘录入数据不断地往服务器端发送数据案例
这里要封装通道流,封装键盘录入数据流. 同样地,还是两台电脑.一个客户端,一个服务器. 客户端代码: import java.io.BufferedReader; import java.io.Buf ...
- tcp协议下粘包问题的产生及解决方案
1 tcp有粘包及udp无粘包 - TCP 是面向连接的,面向流的可靠协议:发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据, 合并成 ...
随机推荐
- svn用法
SVN安装与启动服务 1.下载相应匹配版本的TortoiseSVN(客户端)和Subversion(客户端),安装完毕之后. 2.配置相关文件. 选择TortoiseSVN-->create r ...
- scss组件定制的一些学习
应组织上的要求,简化前端开发,提高工作效率,开始着手研究scss框架及组件化. 把一些长的像的弄在一起,就有了组件化. 但组件只用一部分需要的,就有了定制. 下面是参考一个button组件写出的一些简 ...
- 《python基础教程》笔记之 条件语句和循环语句
布尔变量 下面的值会被解释器看做假(false): False None 0 "" () {} [] 其它的一切都被解释为真. >>> TrueTrue>& ...
- jsp语法与标签
语法: <% 多行java代码 %> 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本.HTML标记和其他JSP元素. 举例: <% int x = 10; ...
- MVC3.0,路由设置实现伪静态IIS中404错误
C# code? 1 2 3 4 5 routes.MapRoute("NewQueryTest.asp", "NewQueryTest ...
- uva 10032 Problem F: Tug of War
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 【转】Linux中断处理学习笔记
原文网址:http://www.cnblogs.com/GT_Andy/archive/2011/06/21/2086100.html 1.Linux中断的注册与释放: 在<linux/inte ...
- 你该学点HTML/CSS知识的9大理由
每个人都应该学写代码——这一观点简直就是铺天盖地地映入我们眼帘.或许你会莫名其妙,程序员学代码那是理所应当,但是作为一个作家.营销人员.财务工作者甚至是工人,为什么也需要学习代码呢? 好吧,下面我会告 ...
- Codeforces Round #316 (Div. 2) D、E
Problem D: 题意:给定一棵n个点树,每个点有一个字母,有m个询问,每次询问某个节点x的子树中所有深度为k的点能否组成一个回文串 分析:一堆点能组成回文串当且仅当数量为奇数的字母不多于1个,显 ...
- mysql 索引相关知识
由where 1 =1 引发的思考 最近工作上被说了 说代码中不能用 where 1=1,当时觉得是应该可以用的,但是找不到什么理据, 而且mysql 语句优化这方面确实很薄弱 感觉自己mysql ...