本人小白菜逼一枚,,,,刚建立博客,也写不了太深入的,就写点上课的笔记什么的。有错误希望广大博友指出,我一定虚心学习接收改正。

我的新浪邮箱: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协议下的数据传送的更多相关文章

  1. TCP协议下大数据传输IOCP乱序问题

    毕业后稀里糊涂的闭门造车了两年,自己的独立博客也写了两年,各种乱七八糟,最近准备把自己博客废了,现在来看了下这两年写的对我来说略微有点意义的文章只此一篇,转载过来以作留念. 写的很肤浅且凌乱,请见谅. ...

  2. TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q

    TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q 一.TCP协议下的服务端并发 ''' 将不同的功能尽量拆分成不同的函数,拆分出来的功能可以被多个地方使用 TCP服务 ...

  3. tcp协议下的Socket

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net ...

  4. 网络编程--使用TCP协议发送接收数据

    package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...

  5. TCP协议下Socket的基础编程类型

    套接字的基本操作有: 创建(socket).命名(bind).侦听(listen).连接(accept).关闭(shutdown).发送(send).接受(recv). 下面逐个分析: 一.创建(so ...

  6. 《java入门第一季》之tcp协议下的网络编程

    tcp协议相对于udp更加安全. 首先看一下需求:服务器端开启,多个客户端同时向服务器发送数据,看哪个客户端先到达. 说明:这里我开启三个电脑实验,一台电脑写服务器端的程序,两台电脑开客户端的程序.服 ...

  7. 基于tcp协议下粘包现象和解决方案,socketserver

    一.缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送 ...

  8. 《java入门第一季》之tcp协议下的编程实现键盘录入数据不断地往服务器端发送数据案例

    这里要封装通道流,封装键盘录入数据流. 同样地,还是两台电脑.一个客户端,一个服务器. 客户端代码: import java.io.BufferedReader; import java.io.Buf ...

  9. tcp协议下粘包问题的产生及解决方案

    1 tcp有粘包及udp无粘包 - TCP 是面向连接的,面向流的可靠协议:发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据, 合并成 ...

随机推荐

  1. CSS代码写出的各种形状图形

    做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片,今天就在这里教大家怎样用css代码写出各种规则不同的图形 1.正方形 #square {width ...

  2. python 操作 mysql基础补充

    前言 本篇的主要内容为整理mysql的基础内容,分享的同时方便日后查阅,同时结合python的学习整理python操作mysql的方法以及python的ORM. 一.数据库初探 在开始mysql之前先 ...

  3. NVIDIA 显卡温度提示过高,显卡温度高99度怎么办?

    你可能没有在意您的NVIDIA(英伟达)显卡温度,那么你就不会知道显卡温度过高如何导致的呢?也不会知道如果去解决显卡温度过高的问题了,在此我希望在电脑玩游戏或者在办公中电脑速度快慢,或者发热的情况下, ...

  4. Oracle 序列(sequence)

    序列是Oracle特有的,他可以维护一个自增的数字序列,通常从1开始增长,但可以设置. (1)创建序列: increment (2)使用序列: insert into student(sno,name ...

  5. Activity大致会经过如下四个状态

    1.活动主题:当前Activity位于前台,用户可见,可以获得焦点.2.暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点.3.停止状态:该Activity不可见,失 ...

  6. php5,Apache在windows 7环境搭建

    主要是参考以下文章: http://www.cnblogs.com/Yogurshine/archive/2013/05/24/3097343.html http://jingyan.baidu.co ...

  7. VS2008 运行VC\Bin下的link.exe, cl.exe, lib.exe提示找不到mspdb80.dll的解决方法

    天在用link.EXE的LIB命令生成用于连接(LINK)使用的lib文件时提示:找不到mspdb80.dll. 原因:Microsoft Visual Studio\VC\Bin\下没有 “msob ...

  8. Linux系统编程(34)—— socket编程之TCP服务器与客户端的交互

    前面几篇中实现的client每次运行只能从命令行读取一个字符串发给服务器,再从服务器收回来,现在我们把它改成交互式的,不断从终端接受用户输入并和server交互. /* client.c */ #in ...

  9. 获取SQL段的执行时间

    对SQL进行优化 经常会需要知道这条SQL语句执行的时间,这里介绍我的一种常用做法 DECLARE @d DATETIME SET @d=GETDATE() --do something --for ...

  10. Stack & Heap in Java

    Stack and Heap 都是Java用来在RAM中存放数据的地方.Java自动管理堆和栈,用户不能直接的设置堆或栈. Stack:存在于栈中的数据,其大小与生存周期是确定的,栈中的数据可以共享 ...