回射程序(服务器)——客户接收一行数据

本文详细介绍了服务器回显操作的实现方法,包括初始化WinSock、创建监听套接字、接收客户端连接以及数据处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器的编写相对来说就是按照常规的方法,使用recv、send等函数进行接收数据、处理数据、回射数据的操作。

具体还是直接贴上代码吧:!!!

// 回显服务器1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <string.h>

#pragma comment(lib,"wsock32.lib")
#define  SERVERPROT 6000
#define  MAXSIZE 100

int _tmain(int argc, _TCHAR* argv[])
{
	//初始化WinSock
	WSADATA wsaData;
	int ret = WSAStartup(MAKEWORD(2,2),&wsaData);
	if(ret!=0)
	{
		printf("WSAStartup() failed!code:%d\n",WSAGetLastError());
		return -1;
	}
	if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
	{
		WSACleanup();
		printf("Invalid WinSock Version\n");
		return -1;
	}

	//创建监听套接字
	SOCKET slisten;
	slisten = socket(AF_INET,SOCK_STREAM,0);
	if(slisten == INVALID_SOCKET)
	{
		printf("socket() failed!code:%d\n",WSAGetLastError());
		WSACleanup();
		return -1;
	}

	//构建服务器本地地址信息
	struct sockaddr_in serveraddr;
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(SERVERPROT);
	serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	//绑定
	ret = bind(slisten,(sockaddr*)&serveraddr,sizeof(serveraddr));
	if(ret == SOCKET_ERROR)
	{
		printf("bind() failed!code:%d\n",WSAGetLastError());
		closesocket(slisten);
		WSACleanup();
		return -1;
	}
	//侦听连接请求
	ret = listen(slisten,5);
	if(ret == SOCKET_ERROR)
	{
		printf("listen() failed!code:%d\n",WSAGetLastError());
		closesocket(slisten);
		WSACleanup();
		return -1;
	}
	printf("waiting for client connecting...\n");
	//接收客户端连接
	struct sockaddr_in clientaddr;
	int clientaddrlen = sizeof(clientaddr);
	SOCKET sServer;//连接套接字
	char buff[MAXSIZE];
	char sendbuf[MAXSIZE];
	sServer = accept(slisten,(struct sockaddr*)&clientaddr,&clientaddrlen);
	if(sServer == INVALID_SOCKET)
	{
			printf("accept() failed!code:%d\n",WSAGetLastError());
			closesocket(slisten);
			WSACleanup();
			return -1;
	}
	while(TRUE)
	{
		ret = recv(sServer,buff,MAXSIZE,0);
		if(ret==SOCKET_ERROR)
		{
			int nErrCode = WSAGetLastError();//错误代码
			if (WSAENOTCONN == nErrCode)
			{
				printf("The socket is not connected!\n");

			}else if(WSAESHUTDOWN == nErrCode)
			{
				printf("The socket has been shut down!\n");

			}else if (WSAETIMEDOUT == nErrCode)
			{
				printf("The connection has been dropped!\n");							
			}else if (WSAECONNRESET == nErrCode)
			{
				printf("The virtual circuit was reset by the remote side!\n");
			}else{}	
			closesocket(sServer);
			closesocket(slisten);
			WSACleanup();
			return -1;
		}
		sprintf(sendbuf,"echo:%s",buff);
		printf("%s\n",sendbuf);
		ret = send(sServer,sendbuf,strlen(sendbuf),0);
		if (SOCKET_ERROR == ret)
		{
			int nErrCode = WSAGetLastError();//错误代码
			if (WSAENOTCONN == nErrCode)
			{
				printf("The socket is not connected!\n");

			}else if(WSAESHUTDOWN == nErrCode)
			{
				printf("The socket has been shut down!\n");

			}else if (WSAETIMEDOUT == nErrCode)
			{
				printf("The connection has been dropped!\n");
			}else{}	
			closesocket(sServer);
			closesocket(slisten);
			WSACleanup();
			return -1;
		}

	}
	return 0;
}

/********************************************************
/*函数作用:接收一行数据
/*参数说明:连接套接字、接收缓存
/*返回值:成功返回TRUE,失败返回FALSE
/********************************************************/
/*BOOL recvline(SOCKET S,char* buf)
{
	BOOL retval = TRUE; //返回值
	BOOL bLineEnd = FALSE;//一行读取结束
	int nReadLen = 0; //读入字节数
	int nDataLen = 0; //数据长度

	while(!bLineEnd)
	{
		nReadLen = recv(S,buf+nDataLen,MAXSIZE,0);
		if(nReadLen == SOCKET_ERROR)
		{
			int nErrCode = WSAGetLastError();   // 获取错误代码  
			if(WSAENOTCONN == nErrCode)  
			{  
				printf("套接字没有连接\n");  
			} else if(WSAESHUTDOWN == nErrCode)  
			{  
				printf("套接字已经关闭\n");  
			} else if(WSAETIMEDOUT == nErrCode)  
			{  
				printf("请求超时,主机没有反应\n");  
			} else if(WSAECONNRESET == nErrCode)  
			{  
				printf("远程主机强迫关闭了现有的连接\n");  
			} else {}  

			retval = FALSE;   // 读取数据失败  
			break;              // 跳出循环  
		}
		if(0==nReadLen)
		{
			retval = FALSE; //读取数据失败
			break;
		}
		for(int i=0;i<sizeof(buf);i++)
		{
			if('\n' == *(buf+i))
			{
				bLineEnd = TRUE; //接收数据结束
			}
			else
			{
				nDataLen += nReadLen;
			}
		}
	}
	return retval;

}*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值