2023年8月3日发(作者:)
⾯向⾮连接的基础Socket编程实验三 ⾯向⾮连接的基础Socket编程⼀、 实验⽬的1.了解⾯向⾮连接的Socket通信流程。2.掌握使⽤WinSock函数编写⾯向⾮连接的⽹络应⽤程序的⽅法。⼆、实验内容利⽤数据报套接字编程实现⽹络通信程序。要求如下:1.发送端从控制台读取信息并发送,接收端接收信息后打印信息然后回送收到的信息。信息的发送和接收可以多次进⾏。当收到的信息为“exit”时,双⽅程序退出。2.启动发送端和接收端程序进⾏信息收发测试。三、实验原理⾯向⾮连接就是udp通信数据报式套接字提供⽆连接的书籍传输服务。数据包被独⽴的发送,数据可能丢失或重复。在⽆连接服务中,每次数据传输并不需要建⽴连接,因此每个分组数据包中必须包含完整的⽬的地址,并且每个数据包都独⽴的在⽹络中传输。⽆连接服务不能保证分组的先后顺序,不能保证数据传输的可靠性。Udp提供⽆连接的数据报服务。⾯向⾮连接的socket通信流程⽐较简单,在服务器程序中不需要调⽤listen()和accept()函数来等待客户端的连接;在客户端程序中也不需要与服务器建⽴连接,⽽是直接向服务器发送数据。四、实验步骤Server:1.建⽴数据报式套接字,返回套接字号s【socket( )】2.套接字s与本地地址(IP+端⼝)绑定【bind( )】3.在套接字ns上读/写数据,直到结束【sendto( )】【recvfrom( )】4.关闭套接字ns 【closesocket( )】Client:1.建⽴数据报式套接字,返回套接字号s【socket( )】2.在套接字ns上读/写数据,直到结束【sendto( )】【recvfrom( )】3.关闭套接字ns 【closesocket( )】五、实验⼩结附:程序源代码Server:// Udp_:
定义控制台应⽤程序的⼊⼝点。////相关头⽂件#include "stdafx.h"#include
int main(){ //初始化 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup initialization failed"); return 0; }
//变量的声明,赋值 //变量的声明,赋值 SOCKET RecvSocket; sockaddr_in RecvAddr; int Port = 8888; char RecvBuf[1024]; //接收缓冲 char SendBuf[1024]; //发送缓冲 int BufLen = 1024; sockaddr_in SenderAddr; int SenderAddrSize = sizeof(SenderAddr);
//创建接受数据的socket RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//绑定ip和端⼝ _family = AF_INET; _port = htons(Port); _addr.S_un.S_addr = htonl(INADDR_ANY); bind(RecvSocket, (SOCKADDR *)&RecvAddr, sizeof(RecvAddr));
printf("UDP Server start successed,waiting for "); while (true) {
//接收 int re_number = recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize ); if (re_number > 0) { printf("Recieved UDP data from client :%sn", &RecvBuf); if (strcmp(RecvBuf, "exit") == 0) { closesocket(RecvSocket); return 0; } }
//发送 gets_s(SendBuf); //获取键盘输⼊
//发送函数 int send_number = sendto(RecvSocket,
SendBuf, BufLen,
0,
(SOCKADDR *)&SenderAddr,
sizeof(SenderAddr) ); printf("server_to_client: %sn", SendBuf); if (strcmp(SendBuf, "exit") == 0){ closesocket(RecvSocket); return 0; } } if (WSACleanup() == SOCKET_ERROR) printf("WSACleanup failed"); return 0;
}Client:// Udp_:
定义控制台应⽤程序的⼊⼝点。//////相关头⽂件#include "stdafx.h"#include
int main(){ //初始化 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup initialization failed"); return 0; }
//变量的声明,赋值 SOCKET SendSocket;
sockaddr_in RecvAddr; //服务器端的地址 int Port = 8888; char SendBuf[1024]; char RecvBuf[1024]; int BufLen = 1024;
//创建soclket SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//设置服务器地址 _family = AF_INET; _port = htons(Port); //_addr.s_addr = inet_addr("127.0.0.1"); //vs2017不⽀持此写法 InetPton(AF_INET, _T("127.0.0.1"), &_addr.s_addr); int RecvAddrSize = sizeof(RecvAddr); //向服务器发送数据 printf("UDP Client start successed,waiting for ");
while (true) { //scanf_s("%s",SendBuf); //如果使⽤这个函数,则会向客户端发送死循环的“烫”,原因是没有结束符,空字符串打印出来就是乱码!
//发送 gets_s(SendBuf); int st = sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *)&RecvAddr, sizeof(RecvAddr) ); if (strcmp(SendBuf, "exit") == 0) { closesocket(SendSocket); return 0; }
//接受 int recv_number = recvfrom(SendSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&RecvAddr, &RecvAddrSize); printf("From server: %sn" ,RecvBuf); if (strcmp(RecvBuf, "exit") == 0) { closesocket(SendSocket); return 0; } if (st == SOCKET_ERROR) { printf("Exiting.n"); closesocket(SendSocket); closesocket(SendSocket); WSACleanup(); return -1; } }
}
2023年8月3日发(作者:)
⾯向⾮连接的基础Socket编程实验三 ⾯向⾮连接的基础Socket编程⼀、 实验⽬的1.了解⾯向⾮连接的Socket通信流程。2.掌握使⽤WinSock函数编写⾯向⾮连接的⽹络应⽤程序的⽅法。⼆、实验内容利⽤数据报套接字编程实现⽹络通信程序。要求如下:1.发送端从控制台读取信息并发送,接收端接收信息后打印信息然后回送收到的信息。信息的发送和接收可以多次进⾏。当收到的信息为“exit”时,双⽅程序退出。2.启动发送端和接收端程序进⾏信息收发测试。三、实验原理⾯向⾮连接就是udp通信数据报式套接字提供⽆连接的书籍传输服务。数据包被独⽴的发送,数据可能丢失或重复。在⽆连接服务中,每次数据传输并不需要建⽴连接,因此每个分组数据包中必须包含完整的⽬的地址,并且每个数据包都独⽴的在⽹络中传输。⽆连接服务不能保证分组的先后顺序,不能保证数据传输的可靠性。Udp提供⽆连接的数据报服务。⾯向⾮连接的socket通信流程⽐较简单,在服务器程序中不需要调⽤listen()和accept()函数来等待客户端的连接;在客户端程序中也不需要与服务器建⽴连接,⽽是直接向服务器发送数据。四、实验步骤Server:1.建⽴数据报式套接字,返回套接字号s【socket( )】2.套接字s与本地地址(IP+端⼝)绑定【bind( )】3.在套接字ns上读/写数据,直到结束【sendto( )】【recvfrom( )】4.关闭套接字ns 【closesocket( )】Client:1.建⽴数据报式套接字,返回套接字号s【socket( )】2.在套接字ns上读/写数据,直到结束【sendto( )】【recvfrom( )】3.关闭套接字ns 【closesocket( )】五、实验⼩结附:程序源代码Server:// Udp_:
定义控制台应⽤程序的⼊⼝点。////相关头⽂件#include "stdafx.h"#include
int main(){ //初始化 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup initialization failed"); return 0; }
//变量的声明,赋值 //变量的声明,赋值 SOCKET RecvSocket; sockaddr_in RecvAddr; int Port = 8888; char RecvBuf[1024]; //接收缓冲 char SendBuf[1024]; //发送缓冲 int BufLen = 1024; sockaddr_in SenderAddr; int SenderAddrSize = sizeof(SenderAddr);
//创建接受数据的socket RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//绑定ip和端⼝ _family = AF_INET; _port = htons(Port); _addr.S_un.S_addr = htonl(INADDR_ANY); bind(RecvSocket, (SOCKADDR *)&RecvAddr, sizeof(RecvAddr));
printf("UDP Server start successed,waiting for "); while (true) {
//接收 int re_number = recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize ); if (re_number > 0) { printf("Recieved UDP data from client :%sn", &RecvBuf); if (strcmp(RecvBuf, "exit") == 0) { closesocket(RecvSocket); return 0; } }
//发送 gets_s(SendBuf); //获取键盘输⼊
//发送函数 int send_number = sendto(RecvSocket,
SendBuf, BufLen,
0,
(SOCKADDR *)&SenderAddr,
sizeof(SenderAddr) ); printf("server_to_client: %sn", SendBuf); if (strcmp(SendBuf, "exit") == 0){ closesocket(RecvSocket); return 0; } } if (WSACleanup() == SOCKET_ERROR) printf("WSACleanup failed"); return 0;
}Client:// Udp_:
定义控制台应⽤程序的⼊⼝点。//////相关头⽂件#include "stdafx.h"#include
int main(){ //初始化 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup initialization failed"); return 0; }
//变量的声明,赋值 SOCKET SendSocket;
sockaddr_in RecvAddr; //服务器端的地址 int Port = 8888; char SendBuf[1024]; char RecvBuf[1024]; int BufLen = 1024;
//创建soclket SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//设置服务器地址 _family = AF_INET; _port = htons(Port); //_addr.s_addr = inet_addr("127.0.0.1"); //vs2017不⽀持此写法 InetPton(AF_INET, _T("127.0.0.1"), &_addr.s_addr); int RecvAddrSize = sizeof(RecvAddr); //向服务器发送数据 printf("UDP Client start successed,waiting for ");
while (true) { //scanf_s("%s",SendBuf); //如果使⽤这个函数,则会向客户端发送死循环的“烫”,原因是没有结束符,空字符串打印出来就是乱码!
//发送 gets_s(SendBuf); int st = sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *)&RecvAddr, sizeof(RecvAddr) ); if (strcmp(SendBuf, "exit") == 0) { closesocket(SendSocket); return 0; }
//接受 int recv_number = recvfrom(SendSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&RecvAddr, &RecvAddrSize); printf("From server: %sn" ,RecvBuf); if (strcmp(RecvBuf, "exit") == 0) { closesocket(SendSocket); return 0; } if (st == SOCKET_ERROR) { printf("Exiting.n"); closesocket(SendSocket); closesocket(SendSocket); WSACleanup(); return -1; } }
}
发布评论