编写网络通信程序
《网络程序设计》上机实验报告2
编写网络通信程序
[实验目的]
利用套接字设计实现网络通信程序。
[实验要求]
1.要求设计并实现服务器和客户端,通过套接字进行通信。
2.流式套接字必须使用。
3.给出实验中主要的程序代码以及运行结果,并把编译、运行过程中出现的问题以及解决方法填入实验报告中,按时上交。
[实验学时] 2 学时。
[实验内容]
流式套接字工作流程
服务端:
#define _CRT_SECURE_NO_WARNINGS
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
//创建套接字,socket前的一些检查工作,包括服务的启动
WORD myVersionRequest;
WSADATA wsaData;
myVersionRequest = MAKEWORD(1, 1);
int err;
err = WSAStartup(myVersionRequest, &wsaData);
if (!err)
{
printf("已打开套接字\n");
}
else
{
//进一步绑定套接字
printf("嵌套字未打开!");
return 0;
}
SOCKET serSocket = socket(AF_INET, SOCK_STREAM, 0);//创建了可识别套接字
//需要绑定的参数,主要是本地的socket的一些信息。
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//ip地址
addr.sin_port = htons(6000);//绑定端口
bind(serSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR));//绑定完成
listen(serSocket, 5);//其中第二个参数代表能够接收的最多的连接数
SOCKADDR_IN clientsocket;
int len = sizeof(SOCKADDR);
while (1)
{
//第二次握手,通过accept来接受对方的套接字的信息
SOCKET serConn = accept(serSocket, (SOCKADDR*)&clientsocket, &len);//如果这里不是accept而是conection的话。。就会不断的监听
char sendBuf[100];
sprintf(sendBuf, "welcome %s to bejing", inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里
//发送信息
send(serConn, sendBuf, strlen(sendBuf) + 1, 0);
char receiveBuf[100];//接收
recv(serConn, receiveBuf, strlen(receiveBuf) + 1, 0);
printf("%s\n", receiveBuf);
closesocket(serConn);//关闭
WSACleanup();//释放资源的操作
}
return 0;
}
客户端:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
//SOCKET前的一些检查,检查协议库的版本,为了避免别的版本的socket,并且通过
//WSAStartup启动对应的版本,WSAStartup的参数一个是版本信息,一个是一些详细的细节,注意高低位
//WSAStartup与WSACleanup对应
int err;
WORD versionRequired;
WSADATA wsaData;
versionRequired = MAKEWORD(1, 1);
err = WSAStartup(versionRequired, &wsaData);//协议库的版本信息
//通过WSACleanup的返回值来确定socket协议是否启动
if (!err)
{
printf("客户端嵌套字已经打开!\n");
}
else
{
printf("客户端的嵌套字打开失败!\n");
return 0;//结束
}
//创建socket这个关键词,这里想一下那个图形中的socket抽象层
//注意socket这个函数,他三个参数定义了socket的所处的系统,socket的类型,以及一些其他信息
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
//socket编程中,它定义了一个结构体SOCKADDR_IN来存计算机的一些信息,像socket的系统,
//端口号,ip地址等信息,这里存储的是服务器端的计算机的信息
SOCKADDR_IN clientsock_in;
clientsock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
clientsock_in.sin_family = AF_INET;
clientsock_in.sin_port = htons(6000);
//前期定义了套接字,定义了服务器端的计算机的一些信息存储在clientsock_in中,
//准备工作完成后,然后开始将这个套接字链接到远程的计算机
//也就是第一次握手
connect(clientSocket, (SOCKADDR*)&clientsock_in, sizeof(SOCKADDR));//开始连接
char receiveBuf[100];
//解释socket里面的内容
recv(clientSocket, receiveBuf, 101, 0);
printf("%s\n", receiveBuf);
//发送socket数据
send(clientSocket, "hello,this is client", strlen("hello,this is client") + 1, 0);
//关闭套接字
closesocket(clientSocket);
//关闭服务
WSACleanup();
return 0;
}
序代码以及运行结果
[实验总结]
1、创建套接字:使用socket函数创建一个流式套接字,指定地址族(AF_INET)和套接字类型(SOCK_STREAM)。
2、绑定地址:使用bind函数将套接字与本地地址(包括IP地址和端口号)绑定起来。
3、监听连接请求:使用listen函数监听指定端口上的连接请求。此时套接字处于监听状态,等待客户端的连接。
4、接受连接:使用accept函数接受客户端的连接请求。accept函数会阻塞运行,直到有客户端连接到达。
5、数据传输:一旦连接建立,可以使用send函数向客户端发送数据,使用recv函数接收客户端发送的数据,通过读写套接字进行数据传输。
6、关闭连接:使用close函数关闭套接字连接,释放资源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端