编写网络通信程序

《网络程序设计》上机实验报告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函数关闭套接字连接,释放资源

posted @   风花赏秋月  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示