您的位置:首页 > 理论基础 > 计算机网络

学习笔记之网络软件设计(一)

2014-04-13 22:08 183 查看
说来惭愧,网络软件设计这门课还是我大学以来的第一门没有学分拿却依然坚持旁听的课程。这个老师挺不错的,技术能力就不用说了,作为一个大学老师,能有这么敬业的精神还是很难得的,自己弄了一个教改班,实验和项目占据大部分,考试只有小部分,我个人觉得这样很好,让我们不会只是为了应付考试而学习,让我们在做实验或者完成小项目的过程中使用到学习的知识,从而能让我们更好的掌握这些知识。课程的第一个项目取名叫回音壁。

一、要求

1、测试两个节点之间的通信延时2、A发出测试报文,B收到后,直接回应。A收到回应后,设法计算从发出到接收之间的延时。3、多次测试,完成延时变化图表和统计平均延时4、*测试与某台指定计算机之间的延时(该计算机已实现在指定端口上,将收到的测试报文直接回送)

二、相关课程知识

1、套接字”(socket)提供给用户需要的通信服务

1.1 套接字的位置

直接面向用户用户→进程→端到端(end to end)传输层之上

1.2 套接字的作用

端到端简单的通信服务较多的套接字服务选择

2、套接字与端口

套接字描述符是一个整数标识,端口号也是一个整数标识SOCKET s;unsigned short port;共同点:它们都是对通信的标识不同点:端口号的使用还要配合IP地址等套接字标识符在套接字函数中使用似乎不需要其它参数的配合理论:套接字描述符用来获得系统通信服务,标识不同的通信服务端口用来标识不同应用进程,以便为它们提供服务不同使用者不同:套接字描述符由应用进程使用端口号由TCP实体使用管理者不同:套接字标识符局限于一个进程内端口号是整个系统统一管理

2.1套接字与端点的关系

用户通过套接字取得系统通信资源和服务寻找系统通信资源通过在套接字上绑定端点地址来指定在哪里取得服务绑定:建立套接字与端点地址之间的映射关系bind(s,addr,)

2.2 建立关系的方法

bind(s, sock_addr);又称显示绑定还有隐式绑定利用某些套接字调用来建立映射关系

3、服务方式

3.1  TCP/IP的传输层服务

TCP:面相连接的可靠协议UDP:面向无连接协议

3.2 指明服务类型的方法

在申请socket时,指定服务类型s = socket(int af,int type  , int protocol);type: SOCK_STREAM 面向连接 TCPSOCK_DGRAM 面向无连接UDPSOCK_RAW 原始服务例:
s=socket(AF_INET,SOCK_DGRAM,0);

4、客户\服务器模式

4.1 C/S 的基本特点

服务器长期运行,持续准备提供服务客户机:提出及中止服务的随意性强

4.2 服务方式

4.2.1 面向连接的服务器申请套接字确定本地端点,填写端点地址建立套接字与端点关系设置为监听模式(服务器模式)接受一个连接完成通信过程关闭连接的套接字4.2.2 面向连接的客户端申请套接字确定本地端点,填写端点地址建立套接字与端点关系确定服务器端点与服务器建立连接完成通信过程关闭套接字

三、相关的课程实验

03-客户服务器模式实验04-套接字标识符本地分配05-网络字节序06-隐式绑定

四、实现过程

1、服务器端

面向连接的服务器,用一个简单的MFC完成。一些代码:
DWORD WINAPI ThreadServer(LPVOID lpParameter)
{
WSAStartup(0x101, &wsa);
s = socket(AF_INET, SOCK_STREAM, 0);
bind(s, (sockaddr*)&ser_addr, sizeof(ser_addr));
listen(s,0);

while(TRUE)
{
int len = sizeof(sockaddr);
newsock = accept(s,(sockaddr*)&remote_addr,&len);
recv(newsock,buf,sizeof(buf),0);
send(newsock,"ACK\0",4,0);
closesocket(newsock);
}

closesocket(s);
WSACleanup();
}

//点击启动运行
void CTanc_mfc_conn_serverDlg::OnRun()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_IPAddress.GetAddress(nf1, nf2, nf3, nf4);
port = m_port;
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.S_un.S_un_b.s_b1 = nf1;
ser_addr.sin_addr.S_un.S_un_b.s_b2 = nf2;
ser_addr.sin_addr.S_un.S_un_b.s_b3 = nf3;
ser_addr.sin_addr.S_un.S_un_b.s_b4 = nf4;
ser_addr.sin_port = htons(port);

//创建服务线程
CreateThread(NULL, 0 ,ThreadServer, NULL, 0, NULL);

}
效果图:

2、客户端

面向连接的客户端。
//点击发送运行
void CTanc_mfc_conn_clientDlg::OnSend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BYTE nf1, nf2, nf3, nf4;
m_IPAddress.GetAddress(nf1, nf2, nf3, nf4);
int port = m_ServerPort;

GetDlgItem(IDC_BUF)->GetWindowText(sendBuf);

WSAStartup(0x101,&wsa);
s = socket(AF_INET,SOCK_STREAM,0);
local.sin_family = AF_INET;
local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
local.sin_port = htons(0x3412);

bind(s,(sockaddr*)&local,sizeof(local));

server.sin_family = AF_INET;
server.sin_addr.S_un.S_un_b.s_b1 = nf1;
server.sin_addr.S_un.S_un_b.s_b2 = nf2;
server.sin_addr.S_un.S_un_b.s_b3 = nf3;
server.sin_addr.S_un.S_un_b.s_b4 = nf4;
server.sin_port = htons(port);

connect(s,(sockaddr*)&server,sizeof(server));

send(s,sendBuf,strlen(sendBuf),0);
recv(s,recvBuf,sizeof(recvBuf),0);

m_receiveBuf = recvBuf;
UpdateData(FALSE);

closesocket(s);
WSACleanup();
}
目前只完成了基本的传输,还有就是计算通信的延时了~ 后面再写。。。接到来。。。客户端加了一个计算通信延时功能,其实也简单。发送时计时,接受时计时,然后计算差值得到延时。
long start_t, finish_t;
start_t = clock();
	//获取当前系统时间time_t t = time(0);char tmp[64];strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A",localtime(&t) ); 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Socket 网络 通信 tcp