高级网络程序设计-基于流式套接字的计算程序设计

运行环境:

windows,VS2019,

用VS新建两个工程,一个用来做服务器,一个做客户端

直接上代码

client.c

#include <winsock.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib"); 
#define MAXLINE 4096	//接收缓冲区长度
#define SERVER_PORT 13	//时间同步服务器端口号 
typedef struct sockaddr sockaddr;
int main(int argc, char* argv[])
{
	char a[MAXLINE];
	printf("请输入a:");
	scanf_s("%s", &a);
	char buff[MAXLINE];
	SOCKET ConnectSocket = INVALID_SOCKET;
	int iResult;
	int senda;
	int sendb;
	struct sockaddr_in servaddr;
	char recvline[MAXLINE + 1]; 	//初始化Windows Sockets DLL;协商版本号

	WORD wVersionRequested;
	WSADATA wsaData; 	//使用MAKEWORD(lowbyte, highbyte) 宏,在windef.h中声明	

	wVersionRequested = MAKEWORD(2, 2);
	iResult = WSAStartup(wVersionRequested, &wsaData);
	if (iResult != 0)
	{
		printf("WSAStartup函数调用错误,错误号:%d\n", WSAGetLastError());
		return 1;
	}
	else
	{
		printf("初始化成功!\n");
	}

	//创建流式套接字	
	if ((ConnectSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("socket函数调用失败,错误号:%d\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	//服务器地址赋值	
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");;
	servaddr.sin_port = htons(SERVER_PORT);

	//向服务器请求连接	
	iResult = connect(ConnectSocket, (sockaddr*)&servaddr, sizeof(servaddr));
	if (iResult == SOCKET_ERROR)
	{
		printf("connect 函数调用错误,错误号:%d\n", WSAGetLastError());
		closesocket(ConnectSocket);
		WSACleanup();
		return 1;
	}
	memset(buff, 0, sizeof(buff));
	sprintf(buff, "%s", a);
	senda= send(ConnectSocket, buff, strlen(buff), 0);
	//持续接收数据,直到服务器关闭连接	
	memset(&recvline, 0, sizeof(recvline));
	printf("接收到来自服务器的数据:");
	do {
		iResult = recv(ConnectSocket, recvline, MAXLINE, 0);
		if (iResult > 0)
			printf("%s\n", recvline);
		else
		{
			if (iResult == 0)
				printf("对方连接关闭,退出\n");
			else
				printf("recv 函数调用错误,错误号:%d\n", WSAGetLastError());
		}
	} while (iResult > 0);

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

server.c

#include <time.h>
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib"); 
#define MAXLINE 4096	//接收缓冲区长度
#define LISTENQ 1024	//监听队列长度
#define SERVER_PORT 13	//时间同步服务器端口号 
int main(int argc, char* argv[])
{
	SOCKET ListenSocket = INVALID_SOCKET, ClientSocket = INVALID_SOCKET;
	int iResult;
	int iResult1;
	int iResult2;
	char recva[MAXLINE + 1];
	struct sockaddr_in servaddr;
	char buff[MAXLINE];	time_t ticks;
	int iSendResult; 	//初始化Windows Sockets DLL;协商版本号	

	WORD wVersionRequested;
	WSADATA wsaData; 	//使用MAKEWORD(lowbyte, highbyte) 宏,在windef.h中声明	

	wVersionRequested = MAKEWORD(2, 2);
	iResult = WSAStartup(wVersionRequested, &wsaData);
	if (iResult != 0)
	{
		printf("WSAStartup函数调用错误,错误号:%d\n", WSAGetLastError());
		return 1;
	}
	else
	{
		printf("初始化成功!\n");
	}

	//创建流式套接字	
	if ((ListenSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("socket函数调用失败,错误号:%d\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1 ");
	servaddr.sin_port = htons(SERVER_PORT);

	//绑定服务器地址	
	iResult = bind(ListenSocket, (struct sockaddr*)&servaddr, sizeof(servaddr));
	if (iResult == SOCKET_ERROR)
	{
		printf("bind 函数调用错误,错误号:%d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}

	//设置服务器位监听状态,监听队列长度为LISTENQ	
	iResult = listen(ListenSocket, LISTENQ);
	if (iResult == SOCKET_ERROR)
	{
		printf("listen 函数调用错误,错误号:%d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}

	while (1)
	{
		//接收客户端连接请求,返回连接套接字ClientSocket		
		ClientSocket = accept(ListenSocket, NULL, NULL);
		if (ClientSocket == INVALID_SOCKET)
		{
			printf("accept 函数调用错误,错误号:%d\n", WSAGetLastError());
			closesocket(ListenSocket);
			WSACleanup();
			return 1;
		}
		memset(&recva, 0, sizeof(recva));
		iResult1 = recv(ClientSocket, recva, MAXLINE, 0);
		printf("接收到来自客户端的数据%s,", recva);
		//发送		
		iSendResult = send(ClientSocket, recva, strlen(recva), 0);
		if (iSendResult == SOCKET_ERROR)
		{
			printf("send 函数调用错误,错误号:%d\n", WSAGetLastError());
			closesocket(ListenSocket);
			WSACleanup();
			return 1;
		}
		printf("计算成功,已发送至客户端\n");
	}

	//关闭套接字		
	closesocket(ClientSocket);
	printf("主动关闭连接\n");
	closesocket(ListenSocket);
	WSACleanup();
	return 0;
}

文件上传程序是一种常见的网络应用程序,它允许用户将本地计算机上的文件传输到远程计算机或服务器中。 要编写一个文件上传程序,需要使用TCP协议和流式套接字来实现。TCP协议提供了可靠的数据传输机制,而流式套接字提供了读写文件的能力。 首先,服务器端需要创建一个套接字并绑定一个特定的端口。然后,服务器开始监听客户端的连接请求,并接受连接。一旦连接建立,服务器将创建一个文件,用于接收客户端传输的文件。 客户端需要创建一个套接字,并与服务器的IP地址和端口进行连接。连接建立后,客户端打开本地文件,并读取文件的内容。然后,客户端通过套接字将文件内容传输到服务器。 在传输过程中,服务器和客户端之间交换数据包,以确保文件的可靠传输。服务器端接收来自客户端的数据包,并将其写入接收文件中。客户端发送数据包,并等待服务器确认。 传输完成后,服务器端关闭连接,并通知客户端文件传输完成。客户端也关闭连接,并显示传输成功的信息。 在编写文件上传程序时,还需要考虑以下几个方面: 1. 错误处理:包括连接错误、文件打开错误、传输错误等。对于这些错误应进行适当的处理,例如显示错误信息、重新传输等。 2. 文件分块传输:对于大文件,可以将文件分成多个块进行传输,以提高传输效率。 3. 进度显示:可以显示文件传输的进度,让用户了解传输的情况。 总结起来,文件上传程序是一个基于TCP协议和流式套接字网络应用程序。通过合理的设计和实现,可以实现可靠、高效的文件传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

return you

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值