第一篇:c语言简单socket通信
server:
#include
#include
#pragma comment(lib,“ws2_32.lib”)
int main(int argc, char* argv[]){
//³õʼ»¯WSA
WORD sockVersion = MAKEWORD(2,2);WSADATA wsaData;if(WSAStartup(sockVersion, &wsaData)!=0){return 0;} //´´½¨Ì×½Ó×Ö SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(slisten == INVALID_SOCKET){printf(“socket error!”);return 0;} //°ó¶¨IPºÍ¶Ë¿Ú sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = INADDR_ANY;if(bind(slisten,(LPSOCKADDR)&sin, sizeof(sin))== SOCKET_ERROR){printf(“bind error!”);} //¿ªÊ¼¼àÌý if(listen(slisten, 5)== SOCKET_ERROR){} //Ñ-»·½ÓÊÕÊý¾Ý SOCKET sClient;sockaddr_in remoteAddr;printf(“listen error!”);return 0;
char revData[255];while(true){printf(“µÈ´ýÁ¬½Ó...n”);sClient = accept(slisten,(SOCKADDR *)&remoteAddr, &nAddrlen);if(sClient == INVALID_SOCKET)
{
printf(“accept error!”);
continue;
}
printf(“½ÓÊܵ½Ò»¸öÁ¬½Ó£º%s
inet_ntoa(remoteAddr.sin_addr));
//½ÓÊÕÊý¾Ý
int ret = recv(sClient, revData, 255, 0);
if(ret > 0)
{
revData[ret] = 0x00;
printf(revData);
}
//·¢ËÍÊý¾Ý
char * sendData = ”ÄãºÃ£¬TCP¿Í»§¶Ë£¡n“;
send(sClient, sendData, strlen(sendData), 0);
closesocket(sClient);
}
closesocket(slisten);
WSACleanup();
return 0;
}
client:
#include
#include
#pragmacomment(lib,”ws2_32.lib“)
rn”,int main(int argc, char* argv[])
{
WORD sockVersion = MAKEWORD(2,2);
WSADATA data;
if(WSAStartup(sockVersion, &data)!= 0)
{
return 0;
}
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sclient == INVALID_SOCKET)
{
printf(“invalid socket!”);
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);
if(connect(sclient,(sockaddr *)&serAddr, sizeof(serAddr))SOCKET_ERROR)
{
printf(“connect error!”);
closesocket(sclient);
return 0;
}
char * sendData = “ÄãºÃ£¬TCP·þÎñ¶Ë£¬ÎÒÊÇ¿Í»§¶Ë!n”;
send(sclient, sendData, strlen(sendData), 0);
char recData[255];
int ret = recv(sclient, recData, 255, 0);
if(ret > 0)
{
recData[ret] = 0x00;
printf(recData);
}
closesocket(sclient);
WSACleanup();
return 0;
} ==
第二篇:socket通信原理
Socket原理,大致分为以下几个步骤。
服务器端的步骤如下。
(1)首先,在实用Socket之前,要首先初始化Socket,就是实用AfxSocketInit()函数。
(2)在初始化完成以后,就可以建立服务端的Socket,然后实用该Sokcet开始侦听整个网络中的连接请求。
(3)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。连接的过程中,在MFC的框架中会触发一个前面创建的服务端Socket的消息响应函数OnAccept(),我们将建立的连接的代码放到该响应函数里面,在建立连接的过程中,会产生一个新的Socket,我们使用找个Socket来进行数据的通信。
(4)在通信的过程中,服务器端的产生的新的Socket会通过一个消息响应函数OnReceive()来接受到达的数据。数据的发送可以使用Send()来完成(5)当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤如下。
(1)同样的,初始化Socket,并建立客户端的Socket,确定要连接的服务器的主机名和端口。
(2)发送连接请求到服务器(MFC中使用Connect()),并等待服务器的回馈信息。
(3)连接成功后,与服务器进行数据的交互。
(4)数据的读取同服务端一样,也是通过OnReceive()来完成的,数据的发送通过Send()即可。
(5)数据处理完毕后,关闭自身的Socket连接。
这就是网络Socket的原理的简单介绍,大家有什么疑问可以提出来,另外,在服务器端建立Socket连接的过程中,如何支持并发的最大数量,以及服务器端的负载问题,大家可以多加研究一下。
第三篇:vc socket通信实例总结
VC++ socket通信实例 总结
1.两天计算机通信需要协议,通信的两台计算机IP必须唯一
2.同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一标示。
3.实际上就类似于一个办公室的总机号码(IP)和分机号码(端口号)
4.协议:为了进行网络中的数据交换(通信)而建立的规则、标准或约定
5.协议=语义+语法+规则 6.不同层具有各自不同的协议
7.上层使用下层提供的服务,实际通信在最底层完成
8.对等层实体之间虚拟通信| 9.TCP:面向连接的可靠的传输协议 10.UDP:面向无连接的不可靠的传输协议
11.端口是一种抽象的软件结构。应用程序通过系统调用与某端口建立连接后,传输层传给端口的数据都被响应的进行所接收,相应进程发给传输层的数据都通过该端口输出。12.端口用一个整数型标示符来表示。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立。13.端口使用一个16位的数字来表示,它的范围是0~65535,1024以下的端口号保留给预定义的服务。例如:http使用的是80端口。
14.socket(套接字):windows sockets只支持一个通信区域:网际域(AF_INET),这个域被使用网际协议簇通信的进程使用。
15.C/S模式:客户机向服务器提出请求,服务器接收到请求后,提供相应的服务。16.套接字的类型
a)
流式套接字:(SOCK_STREAM):面向连接可靠的数据传输服务,按顺序接收
b)
数据包式套接字:(SOCK_DGRAM):无连接服务。接收顺序混乱。
c)
原始套接字(SOCK_RAM)17.基于TCP(面向连接)的socket编程 a)
服务器端程序:
i.创建套接字socket
ii.将套接字绑定到一个本地地址和端口上bind
iii.将套接字设为监听模式,准备接收客户请求listen
iv.等待客户请求到了;当请求到来后,接收连接请求,返回一个新的对应于此次连接的套接字accept
v.和客户端进行通信rend/recv
vi.户请求
vii.b)
客户端程序:
i.socket
ii.接请求connect
iii.通信rend/recv
iv.18.基于UDP的socket编程 a)
服务器端(接收端)程序:
i.socket
用返回的套接字 返回,等待另一客关闭套接字
创建套接字
向服务端发出连
和服务器端进行 关闭套接字
创建套接字
ii.将套接字绑定到一个本地地址和端口上bind
iii.等待接收数据recv/from
iv.关闭套接字 b)
客户端(发送端)程序:
i.创建套接字socket
ii.向服务器发送数据sendto
iii.关闭套接字 19.int WSAStartup(WORD wVersionRequested, //打算使用的最高winsock版本号
LPWSADATA lpWSAData //是个结构体,接收socket的详细信息);20.alt+F8:格式化代码 21.面向TCP的连接,服务器端
a)
套接字SOCKET socket(int af,//指定地址簇
int type,//socket类型
int protocol //协议);b)
绑定int bind(SOCKET s,//要绑定的套接字
const struct sockaddr FAR* name, //指定了该套接字的本地地址信息
int namelen
//该地址结构的长度);struct sockaddr {
u_short
sa_family;
char
sa_data[14];};c)
监听int listen(SOCKET s,int backlog);d)
接受连接SOCKET accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);e)
发送int send(SOCKET s,//建立连接的socket const char FAR * buf, //发送的数据
int len,//发送数据的长度
int flags);f)
接收int recv(SOCKET s,char FAR* buf,int len,int flags);g)
需要的文件#include
Socket b)
连接:connect int connect(SOCKET s,const struct sockaddr FAR* name,int namelen);c)
接收:recv d)
发送:send e)
关闭:closesocket
Tcp服务端程序:=========#include
#include
voidmain()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err!= 0){
return;
}
if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,“Welcome %s to 刘洼村”,inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf(“%sn”,recvBuf);
closesocket(sockConn);
}
} 24.Tcp客户端程序:[cpp] view plaincopy#include
#include
void main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err!= 0){
return;
}
if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);//服务器端的地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf(“%sn”,recvBuf);
send(sockClient,“This is 刘洼村”,strlen(“This is 刘洼村”)+1,0);
closesocket(sockClient);
WSACleanup();}
25.运行之后,开启了6个客户端,一个服务器端。程序运行效果:
26.面向UDP的连接 27.服务器:socket a)
bind b)
接收数据:int recvfrom(SOCKET s,//套接字
char FAR* buf,//接收数据
int len,//长度
int flags,//会影响调用行为,0 struct sockaddr FAR* from, //接收发送方的地址信息
int FAR* fromlen
//接收长度);c)
关闭closesocket d)
Cleanup 28.UDP服务器端程序:[cpp] view plaincopy#include
#include
void main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err!= 0){
return;
}
if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf(“%sn”,recvBuf);
closesocket(sockSrv);
WSACleanup();
} 28.UDP客户端: a)
socket定义
b)
发送:
int sendto(SOCKET s,const char FAR * buf,int len,int flags,const struct sockaddr FAR * to,int tolen);29.UDP客户端程序[cpp] view plaincopy#include
#include
void main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err!= 0){
return;
}
if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
sendto(sockClient,“Hello 刘洼村”,strlen(“Hello 刘洼村”)+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();} 运行结果:
30.注意:每个程序都要加上ws2_32.lib链接库。如下添加:
By 刘洼村
第四篇:C语言socket课程设计报告[小编推荐]
第1章 概述
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。TCP支持的应用协议主要有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
面向连接的TCP
“面向连接”就是在正式通信前必须要与对方建立起连接。比如你给别人打电话,必须等线路接通了、对方拿起话筒才能相互通话。
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。
面向非连接的UDP协议
“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。
UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效率高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。
第2章 程序设计部分
2.1 设计目的
通过本课程设计,在学习《计算机通信与网络C》课程的基础上,进一步深入理解计算机通信与网络的基本理论及其协议,进一步熟练掌握UDP、TCP Client/Server模式的数据通信原理,熟悉进程通信的所要解决的问题,掌握网络通信的程序编程技术。
2.2 设计要求
1)Java语言支持TCP/UDP及其上层的网络设计,所设计的网络通信应用系统建议采用Java语言利用Eclipse集成开发环境编程实现。课程设计按下述步骤进行:
①利用socket编程方法,编写一个TCP、UDP Client/Server模式的通信程序。②调试并运行自己编写的实现程序。
③了解TCP、UDP Client/Server模式的工作原理,比较二者的不同,如出现异常情况,在课程设计报告中写出原因分析。
④备份保留程序代码电子文档,以备教师随时检查。
2)Client/Server网络通信程序设计内容要具体详实,具有一定的编程工作量(程序代码一般应在100行以上)和技术难度。
3)在课程设计报告中,通过截屏图给出Client/Server网络通信或手机收发电子邮件的运行结果。
4)对课程设计进行总结,写出符合规范格式要求的课程设计报告。课程设计报告撰写要求如下:
①每个学生必须独立完成课程设计报告。
②课程设计报告书写规范、文字通顺、图表清晰、数据完整、结论明确。③课程设计报告后应附参考文献。
④提供电子文档资料。例如程序源代码、设计思路、功能结构图或程序流程图等。⑤附录:给出程序源代码(可附主要部分或代表自己编程特色的代码)。
⑥课程设计报告封面按照学校统一要求格式编写,并装订成册。要求书面工整、美观;如果条件许可,最好打印装订成册。
2.3 设计原理 TCP通信流程:
UDP通信流程:
2.4 设计方案
Socket连接:
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
第3章 程序设计实现部分
3.1 C语言的网络功能与编程简介
网络编程,一定离不开套接口;那什么是套接口呢?在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述符通信的一种方法。目前最常用的套接口是字:字节流套接口(基于TCP)和数据报套接口(基于UDP),当然还有原始套接口(原始套接口提供TCP套接口和UDP套接口所不提供的功能,如构造自己的TCP或UDP分组)等。
3.2 系统原理框图
3.3 程序设计
服务器端:
#include
return;
} if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendbuffer[100];
sprintf(sendbuffer,“Welcome %s here”,inet_ntoa(addrClient.sin_addr));
send(sockConn,我是沈郁,strlen(我是沈郁)+1,0);
char recvchar[100];
recv(sockConn,recvchar,100,0);
printf(“%sn”,recvchar);
closesocket(sockConn);
} } 客户端:
#include
int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup(wVersionRequested, &wsaData);if(err!= 0){ return;} if(LOBYTE(wsaData.wVersion)!= 1 || HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
} SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.19.226.97”);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));char recvBuffer[100];recv(sockClient,recvBuffer,100,0);printf(“%sn”,recvBuffer);send(sockClient,“This is Kary”,strlen(“This is Kary”)+1,0);closesocket(sockClient);WSACleanup();}
3.4 调试结果 服务器:
3.5 课程设计总结
通过本次计算机网络课程设计,我更加充分的理解了课本上的知识,并能够加以扩展,从而应用于实践当中,这几天的课程设计令我受益匪浅,很多平时模棱两可的知识点都认真复习并实践了。本次课程设计是运用Visual C++6.0作为开发平台以及进行编写程序, 在此设计过程中主要经过了审题、需求分析与可行性研究,然后形成设计思路,设计所要实现的功能,最后进行程序的编写与调试,这个过程是不断出现问题并不断的进行修改,深深的感受到亲自动手实践的重要性。在实验的过程中发现学好基础理论知识的重要性,在设计过程中,不断遇到问题,通过老师和同学的帮助,解决了过程中出现的各种问题。
通过本次课程设计,我发现了自己的不足,希望在以后的学习中能够加强学习,提高实际应用能力,和解决问题的能力。
附录:
参考文献
1.(美)Andrew S.Tanenbaum 著,熊桂喜 王小虎译。计算机网络。北京:清华大学出版社,1998年7月第1版。
2.计算机网络原理与技术。刘化君 编著,高电子工业出版社,2012年6月第2版。3.计算机网络与通信。刘化君等编著,高等教育出版社,2011年6月第2版。4.C程序设计。谭浩强著,清华大学出版社,2005年7月第3版。
5.C程序设计语言。Brian W.Kernighan / Dennis M.Ritchie 著,清华大学出版社。
第五篇:socket编程实验心得体会
实验心得体会
在本次实验中,我通过对网络课上所学知识的应用,学到了很多实践中的知识。并且加深了我对课本知识的理解和认识,在实验过程中,更容易记忆和深入理解各种协议的工作以及在网络编程中应该注意的一系列问题。
我们的第一个实验是对ARP、ICMP、FTP和HTTP协议的分析和验证。在利用软件Etherpeek抓取在主机通信中的报文,得到了很多的关于这些协议的具体参数。在课程学习过程中,书本和老师给我的感觉就是太枯燥,通过课本的学习根本没有办法理解各种协议的工作细节。有很多的细微之处是想不通的。但是,在本次实验中,我就通过各种报文的分析,看到了网络中不同层次协议之间的协做过程。对应不同层之间就是通过协议来使用,我对整个网路的大体架构有了一个统筹的了解,虽然对很多的更深入的知识不是很了解,但是比我在课上学的东西要更有趣,而且容易学习,更能够我学习的兴趣。
第二个实验是Socket编程实验。在编写网络程序之前,我对网路通信可以说一无所知,根本不知道那些网路上的程序是怎么通过网路进行通信的。在本次实验中,终于揭开了他们神秘的面纱。当然在实验中出现了很多的插曲,我是在Linux环境下编写的程序,很多技术方面的问题都无法解决。查阅书籍和网上咨询才弄懂了他们的来龙去脉,最终是将我的程序编写完了。开始接触网路编程时,那是一头雾水,根本不知从何下手。在看了辅导教员给我们程序之后才有了很多的起色,才能够自己编写程序。在网络编程中,我最深的体会就是对具体的内部细节不熟悉,导致在调试的过程中感觉到很无力。在很多函数的作用下,经常就是一团乱麻。之后,我每次编写之前就是将用到的函数的用法温习一下,最后还是能够解决很多的问题的。
本次试验是我们学习网路的第一次。以前的课程从来没有接触到网路方面的知识。这次的新知识对我们的挑战还算不是太大,通过我们的努力,所有的困难时被克服掉了。其实,实验应该是我们的重点,在以后的工作中要的就是我们的实际的动手能力,如果我们在学习期间就是只学了书本上的知识,那样对理论的了解是不够深刻的,只有通过实验才能激发我们的学习兴趣。总之,我觉得实验才是检验理论的唯一标准。