在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算法),将多次间隔较小且数据量小的数据, 合并成 ...
随机推荐
- phpcms v9二次开发之数据模型类
系统模型类:model.class.php数据模型类的位置:/phpcms/libs/classes phpcms v9二次开发中,我们要经常需要对模块的数据表进行查询.添加.修改和删除数据等操作,所 ...
- Array and its point.
a is the array name. &a is the ponit of 2-D array which contains a[5]. the type of &a should ...
- d007: 求两数的整数商 和 余数
内容: 求两数的整数商 和 余数 输入说明: 一行两个整数 输出说明: 一行两个整数 输入样例: 18 4 输出样例 : 4 2 #include <stdio.h> int main ...
- 『邪恶のWIFI』搭建假冒WIFI热点等女神来蹭网啊 - -。
pic by baidu 0x 00 ╮(╯▽╰)╭ 请喊我万恶的标题党 哈哈哈哈哈 0x 01 这里正题 虚拟机(Kali)不支持内置网卡,还好我有神器,插上我的RT8187L,开始搞起 参考资料 ...
- java调优随记-java对象大小
在java中,基本数据类型的大小是固定.但是java对象的大小是不固定的,需要通过计算. 在java中,一个空对象(没有属性和方法的对象)在堆中占用8byte,比如 Object obj = new ...
- Http请求工具实例编写
HTTP协议工作方式首先客户端发送一个请求(request)给服务器,服务器在接收到这个请求后将生成一个响应(response)返回给客户端.在这个通信的过程中HTTP协议在以下4个方面做了规定:1. ...
- 【8】JAVA---地址App小软件(AddrDaoFile .class)(数据层)
实现数据进行文件的存储和读写. 本软件也就到此结束了. 没多少可以讲的. 因为这个小软件也就8个类,主要学习的也就是一个分层思想的简单应用. package cn.hncu.addr.dao; imp ...
- linux mount命令学习
我们在下面这篇博文中已经有笼统的学习了文件系统的一些相关知识, http://blog.csdn.net/boyxulin1986/article/details/12107113 本篇我们主要是用来 ...
- MYSQL存储过程,清除指前缀的定表名的数据
MYSQL存储过程,清除指前缀的定表名的数据 DELIMITER $$ DROP PROCEDURE IF EXISTS `drop_table`$$ ),)) BEGIN ) DEFAULT NUL ...
- [Qt]No relevant classes found.
[Qt]No relevant classes found. 我把两个文件加入工程的时候,再编译就出现了No relevant classes found.这个bug.百度了下,找到了答案,参考链接: ...