网络编程——流式套接字编程

【网络编程】利用流式套接字实现文件传输实验 实验内容: 1.    客户端向服务端发起socket连接,并建立数据传输通道; 2.    客户端向服务端发送要传输的文件名称,以‘#’字符结尾,服务端逐字符接收,直到接收到#;(变长数据) 3.    客户端向服务端发送文件长度,4字节;(定长数据) 4.    客户端向服务端发送文件内容;(变长数据) 5.    服务端接收完文件后,向客户端发送‚”OK”,以示成功接收。 6. 阅读详情

目的

(1)熟悉Linux环境下流式套接字编程的基本模型、函数使用细节等,掌握Linux环境下流式套接字编程的具体过程。
(2)熟悉Windows环境下流式套接字编程的基本模型、函数使用细节等,掌握Windows环境下流式套接字编程的具体过程

内容

(1) 使用流式套接字实现一个Linux环境下的迭代回声服务器端(及客户端);
(2) 使用流式套接字实现一个Windows环境下的迭代回声服务器端(及客户端)。
(3) 使服务器端和客户端各传递1次字符串。考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度。连接时服务器端和客户端数据传输格式如下。
在这里插入图片描述
另外,不限制字符串传输顺序及种类,但须进行3次数据交换。
(4) 创建收发文件的服务器端/客户端,实现顺序如下。
客户端接受用户输入的传输文件名。
 客户端请求服务器端传输该文件名所指文件。
如果指定文件存在,服务器端就将其发送给客户端;反之,则断开连接

源代码及结果

(1) 使用流式套接字实现一个Linux环境下的迭代回声服务器端(及客户端);

//服务端(Linux环境下)
//hello_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

void error_handling(char *message);

int main(int argc, char *argv[])
{
	int serv_sock;
	int clnt_sock;

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;

	char message[]="Hello World!";
	
	if(argc!=2){
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}
	
	serv_sock=socket(PF_INET, SOCK_STREAM, 0);
	if(serv_sock == -1)
		error_handling("socket() error");
	
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_addr.sin_port=htons(atoi(argv[1]));
	
	if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 )
		error_handling("bind() error"); 
	
	if(listen(serv_sock, 5)==-1)
		error_handling("listen() error");
	
	clnt_addr_size=sizeof(clnt_addr); 
        while(1){ 
	        clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);
	        if(clnt_sock==-1)
		       error_handling("accept() error");  
	
         	write(clnt_sock, message, sizeof(message));
	        close(clnt_sock);
        }	
	close(serv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

//客户端(linux环境下)
//hello_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

void error_handling(char *message);

int main(int argc, char* argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[30];
	int str_len;
	
	if(argc!=3){
		printf("Usage : %s <IP> <port>\n", argv[0]);
		exit(1);
	}
	
	sock=socket(PF_INET, SOCK_STREAM, 0);
	if(sock == -1)
		error_handling("socket() error");
	
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_addr.sin_port=htons(atoi(argv[2]));
		
	if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) 
		error_handling("connect() error!");
	
	str_len=read(sock, message, sizeof(message)-1);
	if(str_len==-1)
		error_handling("read() error!");
	
	printf("Message from server: %s \n", message);  
	close(sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
在这里插入图片描述
(2) 使用流式套接字实现一个Windows环境下的迭代回声服务器端(及客户端)。

//服务端(windows环境下)
//hello_server_win.c:
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
void ErrorHandling(char* message);

int main(int argc, char* argv[])
{
	WSADATA	wsaData;
	SOCKET hServSock, hClntSock;
	SOCKADDR_IN servAddr, clntAddr;
	int strLen, i;

	int szClntAddr;
	char message[] = "Hello World!";

	if (argc != 2)
	{
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ErrorHandling("WSAStartup() error!");

	hServSock = socket(PF_INET, SOCK_STREAM, 0);
	if (hServSock == INVALID_SOCKET)
		ErrorHandling("socket() error");

	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servAddr.sin_port = htons(atoi(argv[1]));

	if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
		ErrorHandling("bind() error");

	if (listen(hServSock, 5) == SOCKET_ERROR)
		ErrorHandling("listen() error");

	szClntAddr = sizeof(clntAddr);
	while(1)
	{
		hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
		if (hClntSock == -1)
			ErrorHandling("accept() error");
		else
			printf("Connected client %d \n", i + 1);

		send(hClntSock, message, sizeof(message), 0);
		closesocket(hClntSock);
	}

	closesocket(hServSock);
	WSACleanup();
	return 0;
}

void ErrorHandling(char* message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}
//客户端(windows环境下)
//hello_client_win.c:
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
void ErrorHandling(char* message);

int main(int argc, char* argv[])
{
	WSADATA wsaData;
	SOCKET hSocket;
	SOCKADDR_IN servAddr;

	char message[30];
	int strLen;

	if (argc != 3)
	{
		printf("Usage : %s <IP> <port>\n", argv[0]);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ErrorHandling("WSAStartup() error!");

	hSocket = socket(PF_INET, SOCK_STREAM, 0);
	if (hSocket == INVALID_SOCKET)
		ErrorHandling("socket() error");

	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = inet_addr(argv[1]);
	servAddr.sin_port = htons(atoi(argv[2]));

	if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
		ErrorHandling("connect() error!");

	strLen = recv(hSocket, message, sizeof(message) - 1, 0);
	if (strLen == -1)
		ErrorHandling("read() error!");
	printf("Message from server: %s \n", message);

	closesocket(hSocket);
	WSACleanup();
	return 0;
}

void ErrorHandling(char* message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
在这里插入图片描述
(3) 使服务器端和客户端各传递1次字符串。考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度。

//服务端(linux环境下)
//tcp_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUF_SIZE 1024
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int serv_sock;
	int clnt_sock;
        int i,str_len,recv_len,recv_cnt ;

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;

	char message[BUF_SIZE];
	
	if(argc!=2){
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}
	
	//创建服务器端套接字
	serv_sock=socket(PF_INET, SOCK_STREAM, 0);
	if(serv_sock == -1)
		error_handling("socket() error");
	
	//地址信息初始化
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_addr.sin_port=htons(atoi(argv[1]));
	
	//分配地址信息
	if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1)
		error_handling("bind() error"); 
	
	//等待连接请求
	if(listen(serv_sock, 5)==-1)
		error_handling("listen() error");


        clnt_addr_size = sizeof(clnt_addr); 
        for(i=0;i<5;i++){
		//受理客户端发出的连接请求
                clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);
                if(clnt_sock==-1)
			error_handling("accept() error");
                else
			printf("Connected client %d\n",i+1);
		
		//传输数据
		while(1){
			recv_len = 0;
			str_len = 0;
			while(((str_len+4)>recv_len)||recv_len == 0){
				recv_cnt = read(clnt_sock,&message[recv_len],BUF_SIZE-1);
				if(recv_cnt == -1)
					error_handling("read() error!");
				recv_len+=recv_cnt;
				//将前四个字节整数赋值给str_len
				if(recv_len >4)
					memcpy(&str_len,message,4);
			}
			message[recv_len] = 0;
			printf("Message from client:%s",message+4);
			fputs("Input message:",stdout);
          		fgets(message+4,BUF_SIZE-4,stdin);
			str_len = strlen(message+4);
			memcpy(message,&str_len,4);
			write(clnt_sock,message,str_len+4);	
		}
		//断开与客户端的连接
		close(clnt_sock);
        }
	//关闭服务端套接字
	close(serv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

//客户端(linux环境下)
//tcp_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUF_SIZE 1024
void error_handling(char *message);

int main(int argc, char* argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[BUF_SIZE];
	int str_len;
	int i=0, recv_len,recv_cnt;
	
	if(argc!=3){
		printf("Usage : %s <IP> <port>\n", argv[0]);
		exit(1);
	}
	
	//创建客户端套接字
	sock=socket(PF_INET, SOCK_STREAM, 0);
	if(sock == -1)
		error_handling("socket() error");
	
	//地址信息初始化
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_addr.sin_port=htons(atoi(argv[2]));
	
	//请求连接	
	if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) 
		error_handling("connect() error!");
	else
		puts("Connected...............");


	//传输数据
	while(i<3)
	{
		fputs("Input message(Q to quit): ", stdout);
		fgets(message+4, BUF_SIZE-4, stdin);
		if(!strcmp(message+4,"q\n")||!strcmp(message+4,"Q\n"))
			break;
		str_len = strlen(message+4);
		memcpy(message,&str_len,4);
		write(sock,message,str_len+4);
		recv_len = 0;
		str_len = 0;
		
		while(((str_len+4)>recv_len)||recv_len==0){
			recv_cnt = read(sock,&message[recv_len],BUF_SIZE-1);
			if(recv_cnt == -1)
				error_handling("read() error!");
			recv_len+=recv_cnt;
			//将前四个字节整数赋值给str_len
			if(recv_len >4)
				memcpy(&str_len,message,4);
		}
		message[recv_len] = 0;
		printf("Message from server:%s",message+4);
		i++;

	}

	//断开连接
	close(sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
在这里插入图片描述
(4)创建收发文件的服务器端/客户端

//服务端(linux环境下)
//file_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUF_SIZE 1024
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int serv_sock;
	int clnt_sock;
        int str_len,recv_len,recv_cnt ;
	int len;
	FILE *fp;

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;

	char message[BUF_SIZE];
	char filename[50];
	
	if(argc!=2){
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}
	
	//创建服务器端套接字
	serv_sock=socket(PF_INET, SOCK_STREAM, 0);
	if(serv_sock == -1)
		error_handling("socket() error");
	
	//地址信息初始化
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_addr.sin_port=htons(atoi(argv[1]));
	
	//分配地址信息
	if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1)
		error_handling("bind() error"); 
	
	//等待连接请求
	if(listen(serv_sock, 5)==-1)
		error_handling("listen() error");


        clnt_addr_size = sizeof(clnt_addr);
	clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);
        if(clnt_sock==-1)
		error_handling("accept() error");
	else
		printf("Connected client......");
	recv_len = 0;
	str_len = 0;
	while(recv_len==0||(str_len+4)>recv_len){
		recv_cnt = read(clnt_sock,&message[recv_len],BUF_SIZE-1);
		if(recv_cnt == -1)
			error_handling("read() error!");
		recv_len+=recv_cnt;
		//将前四个字节整数赋值给str_len
		if(recv_len >4)
			memcpy(&str_len,message,4);
	}
	message[recv_len] = 0;
	memcpy(filename,message+4,recv_len-4);
	filename[recv_len]=0;
	if(fp = fopen(filename,"rb+")){
		while(!feof(fp)){
			len = fread(message,1,BUF_SIZE,fp);
			write(clnt_sock,message,len);
		}
	}
	else
		printf("The file is not exited!");
	fclose(fp);
	close(clnt_sock);
	//关闭服务端套接字
	close(serv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}
//客户端(linux环境下)
//file_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUF_SIZE 1024
void error_handling(char *message);

int main(int argc, char* argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[BUF_SIZE];
	char filename[50];
	int str_len;
	int recv_cnt;
	FILE* fp;
	
	if(argc!=3){
		printf("Usage : %s <IP> <port>\n", argv[0]);
		exit(1);
	}
	
	//创建客户端套接字
	sock=socket(PF_INET, SOCK_STREAM, 0);
	if(sock == -1)
		error_handling("socket() error");
	
	//地址信息初始化
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_addr.sin_port=htons(atoi(argv[2]));
	
	//请求连接	
	if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) 
		error_handling("connect() error!");
	else
		puts("Connected...............");

	fputs("Input filename: ", stdout);
	fgets(message+4, BUF_SIZE-4, stdin);
	str_len = strlen(message+4);
	memcpy(message,&str_len,4);
	write(sock,message,str_len+4);

	memcpy(filename,message+4,str_len);
	memcpy(filename+str_len,"-new",4);
	filename[str_len+4]='\0';
	if((fp=fopen(filename,"ab"))==NULL){
		close(sock);
		exit(1);	
	}
	while(1){
		recv_cnt = read(sock,message,BUF_SIZE-1);
		if(recv_cnt == -1)
			error_handling("read() error!");
		if(recv_cnt==0)
			break;
		fwrite(message,1,recv_cnt,fp);
	}
	fclose(fp);
	//断开连接
	close(sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

根据前几章的学习理解了基础的套接字原理。同时对面向连接的TCP协议有了更深入的了解,通过套接字实现TCP连接来实现客户端与服务器之间的交互。

100-网络编程——第五章流式套接字 一:TCP协议的传输特点 1.TCP协议是一个面向连接的传输层协议,提供高可靠性字节流传输服务,主要用于一次传输要交换大量报文的情形 为了维护传输的可靠性,TCP增加了许多开销,如:确认、流量控制、计时器以及连接管理等 2.TCP协议的传输特点是: ①端到端通信:TCP提供给应用面向连接的接口。TCP连接是端到端的,客户应用程序在一端,服务器在另一端 ②建立可靠连接:TCP要求客户在应用程序在于服务器交换数据前,先要连接服务器,保证连接可靠建立,建立连接测试了网络的连通性,如果有故障发生,阻碍分组到达远端系 阅读详情

相关推荐

【网络编程】使用流式套接字实现简单的客户端/服务端通信过程

实验要求: 1. 熟悉流式套接字socket函数的使用方法,包括建立连接、数据发送/接收和关闭连接等; 2. 客户端可向服务端发送任意字符串,服务端在接收到该字符串后,回送给客户端; 3. 服务端在接收到新连接后,能够打印出客户端的ip和端口; 4. 服务端采用多线程模式,能够同时接收多个客户端的连接请求,为每个客户端连接开启一个线程; 服务端: #includ

弱菜zc 6880

流式套接字(基于TCP)

【流式套接字的编程(基于tcp协议的】 1.TCP服务端: import socket 1.创建套接字 socket.socket(socket_family=AF_INET, socket_type=SOCK_STREAM proto=0) 功能:创建一个套接字 参数:socket_family : 选择地址族类型AF_INET 使用IPV4       socket_typ...

zhangxuelong461的博客 2298

基于流式套接字的网络编程

网络编程的概念是:多个计算机通过软件编程的方式进行数据传输来达到数据交互的功能。

专注于计算机研发知识和资讯分享 1万+

(TCP IP网络编程)实验一 流式套接字编程

一.实验目的 1)熟悉Linux环境下流式套接字编程的基本模型、函数使用细节等,掌握Linux环境下流式套接字编程的具体过程。 2)熟悉Windows环境下流式套接字编程的基本模型、函数使用细节等,掌握Windows环境下流式套接字编程的具体过程。 二.实验内容 (1) 使用流式套接字实现一个Linux环境下的迭代回声服务器端(及客户端); (2) 使用流式套接字实现一个Windows环境下的迭代回声服务器端(及客户端)。 (3)使服务器端和客户端各传递1次字符串。考虑到使用TCP协议,所以传递字符串

weixin_44209522的博客 3673

Java 远程通讯技术:基于流式套接字的网络编程(BIO、NIO、AIO)

通信的一方扮演客户机的角色,另一方扮演服务器的角色。当服务器端收到客户机发来的连接请求以后,服务器会接受客户机的连接请求,双方建立连接后,就可进行数据的传递。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。数据报文方式的应用场景:由于取消了重发校验机制,能达到较高的通讯速率,可以用作一些对数据可靠性要求不高的通讯,如。流方式的应用场景:通讯可靠,对数据有校验和重发的机制,通常用于数据文件的传输如。等, 适合于大量数据的传输。

专注于计算机研发知识和资讯分享 914

DC-DC BUCK电路 PCB 布局布线 5 要点:以 XL4015 12V转5V 为例解析噪声控制

本文以XL4015 12V转5V降压电路为例,详细解析DC-DC BUCK电路PCB布局布线的5个关键要点,重点探讨噪声控制策略。通过功率回路最小化、热管理与接地优化、电感电容布局、反馈网络防干扰设计以及实测验证技巧,帮助工程师实现高效稳定的电源设计,显著降低输出纹波和电磁干扰。

weixin_29165725的博客 369

网络编程之流式套接字

流式套接字(SOCK_STREAM)是一种网络编程接口,它提供了一种面向连接的、可靠的、无差错和无重复的数据传输服务。而作为服务器,一般是工作在被动连接的方式下,所以必须通过显示的调用bind()将监听套接字绑定到一个端口上,以等待客户端的连接。服务端:socket() --> bind() --> listen() --> accept() --> recv() --> close()客户端:socket() --> connect() --> send() --> recv() --> close()

m0_62574258的博客 1798

Circos图审美拯救计划:用TBtools复刻Nature级共线性分析图谱

本文针对Circos图在共线性分析中的审美提升问题,提供了一套基于TBtools的完整优化方案。通过构建和谐的色彩体系、精细控制信息层布局以及模仿顶刊构图逻辑,详细讲解了如何从配色、透明度、标签显示到高级参数设置,将默认图表升级为具有高级学术美感的Nature级图谱,助力研究者提升论文图表质量。

cherry的博客 911

网络编程四 TCP流式套接字编程

1.流式套接字网络编程的函数: socket(int af,int type,int protocol):af:一个地址描述符,目前仅支持AF_INET格式;type:指定套接字的类型;protocol:指定要使用的特定的传输协议 bind():三个参数分别为:调用套接字socket()反返回的描述符;地址参数;地址结构的大小 listen():指明监听队列长度 unix 上...

Monster7559的博客 1200

N32G003学习——第九章 第三节1 串口 发送

经过第九章前2节的学习,基础打下之后,开始敲代码。

qq_34525008的博客 1034

StarCCM+ 导入STL几何模型进行仿真

通过 Import Surface Mesh 的方法导入 STL 文件进行仿真

薛定谔的alpha狗 6129

Socket编程(C语言实现)——TCP协议(网络间通信AF_INET)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输

① 所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。② Socket是连接运行在网络上的两个程序间的双向通信的端点。③ 网络通讯其实指的就是Socket间的通讯。④ 通讯的两端都有Socket,数据在两个Socket之间通过IO来进行传输。

m0_67403272的博客 4784

极验验证码: 一点即过验证(鼠标轨迹分析)

2、第一个验证接口分析(第一个w值还原) 3、第二个验证接口(第二个w值还原)这里定位w生成跟上篇文章一样,就不展开了;主要分析tt值(鼠标轨迹)的生成逻辑

qq_49268524的博客 1009

流式套接字:基于TCP协议的Socket网络编程(案例1)

Socket:套接字 流式套接字:基于TCP协议的Socket网络编程 工作方式: 1.客户端A连接到服务器; 2.服务器建立连接并把客户端A添加到列表; 3.客户端B、C...连接; 4.客户端B送出消息到服务器; 5.服务器将信息发送给客户端B、C...。 要点: 1.如何建立客户端与服务器之间的初始连接; 2.如何传送信息到服务器; 3.如何接收来自服务器的信息。 ...

weixin_30786617的博客 371

SPICE框架:自博弈提升大语言模型推理能力

自博弈训练是提升大语言模型推理能力的前沿技术,其核心思想是通过模型自我对话实现持续迭代优化。SPICE框架创新性地采用文档驱动的自博弈机制,结合思维链提示和迭代式上下文扩展,显著提升模型在数学证明、逻辑推理等复杂任务中的表现。该技术在代码生成、金融分析等工程场景中展现出23%-41%的性能提升,其关键技术包括多样性控制、质量过滤和记忆管理。随着与RLAIF等强化学习方法的结合,这种训练范式正在推动大模型向更接近人类思维方式的推理能力进化。

weixin_28686771的博客 402

电容放电测试解析

电子设备断电后滤波电容残留电荷存在触电风险,需符合IEC等安全标准对放电时间的要求。放电测试需测量电容电压下降至安全值的时间,设计可采用主动放电电路或被动放电电阻。常见问题包括电阻选择不当或电路设计缺陷,建议预留放电时间裕度并采用组合放电方案。合规的放电设计是确保产品安全性和可靠性的关键环节。

硬核科技 802

[网络编程]Socket_流式套接字编程

流式套接字基本使用 在一个应用程序创建套接字进行通信时,socket()中的通信类型参数会让用户从数据流、数据报、原始类型中作出选择。其中数据流的传输方式就是基于TCP,而TCP因其数据流、可靠的特点适用于大多数情况。 流式套接字特点及适用情况 流式套接字基于传输控制协议提供面向连接的、可靠的(但也会比UDP付出更多传输代价的)数据流传输服务。 因其保证数据能无错无重发出、有序接收的可靠性,...

优快云_orangeP 1690

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Windows网络编程(TCP流式套接字实验)

一、 实验环境 Windows10 vs2017 c/c++ 二、实验内容 1.设计思路 基于流式套接字的时间同步服务器设计 要求使用流式套接字编程,实现时间同步服务器和客户端,该服务器能够接收客户端的查询请求,获取本地时间,并将结果发送回客户端,客户端将该时间显示出来,如图1所示。 (1) time()函数、ctime()函数为时间处理函数。 (2)客户的recv函数需要循环接收。 ...

breaver 2754

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

windows网络编程 使用流式套接字实现网络通信

【实验要求】 (1)使用基本的服务器编程模式,创建流式套接字,根据指定端口号绑定服务,建立监听队列,并接受来自客户端的连接请求,收发数据;使用基本的客户端编程模式,能够创建流式套接字,通过用户的指定的服务器地址向指定服务器发起连接请求,与服务器之间实现收发数据,然后关闭连接。 (2)通过改进服务器端,实现服务器循环为多个客户端提供服务;服务器端能够实现显示对应客户端的IP地址;客户端实现用户输入信息方式与服务器对话。 (3)采用Windows环境下多线程开发方法改进服务器端,对每个客户连接请求独立创建通信线

顾南怀 1652

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

网络编程---实验3 流式套接字的应用

掌握流式套接字的应用

简单点的博客 117

网络编程:流式套接字应用数据完整包读取问题

本文接着上篇分包收包问题隶属同一个问题。今天刚遇到的问题并解决了,TCP协议传输,流式套接字编程,收取网络数据时,从缓冲数据中读取出应用层完整包,原来没有单个固定头长度的数据包取出bug表现,现在后来加入一个只有头的报文进入,于是整个取包就出现混乱。完整性再一次无法愈合。现在重新整理取包流程。msglen = recv(s, buffer, sizeof(buffer), 0); buf4pack

qianwen36的专栏 911

JAVA网络编程——socket套接字的介绍上(详细)

大家好!今天笔者分享一篇关于Socket 套接字的博客,希望能为正在学习网络编程的读者提供一些帮助。梳理网络通信的基础概念本文还将顺带总结一些与 Socket 密切相关的基础知识,包括:IP 地址、端口号、网络协议、五元组、协议分层模型的作用与内容、TCP/UDP 区别、Socket API 的使用方式,以及如何通过代码模拟客户端/服务器之间的通信过程。理解客户端与服务器的数据交互。

cjejwe的博客 6318

linux网络编程(unix域流式套接字)

unix域套接字--流式 1. 头文件        #include          2. 数据结构        struct sockaddr_un {         sa_family_t sun_family;          // __SOCKADDR_COMMON (sun_);                   // #define __SOCKADDR

Linux_dream_2015的博客 1019

网络编程:流式域套接字与报式域套接字

【代码】网络编程:流式域套接字与报式域套接字。

qq_45938871的博客 196
上一篇: DC4靶机练习
下一篇: 网络编程——数据报套接字编程
DiliLearngent
博客等级 码龄7年 977粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值