现在的位置: 首页 > 综合 > 正文

基于TCP的ECHO程序

2014年02月09日 ⁄ 综合 ⁄ 共 2928字 ⁄ 字号 评论关闭

基于TCP的ECHO程序

自己当场手输的文字  勿喷

内容:

所谓echo,就是服务器把它所收到的数据原封不动地回送给客户端。

流程:

1.客户端向服务器发送字符串“Hello world!”;

2.服务器收到后,显示客户端的地址和端口,并把收到的数据回送给客户端;

3.客户端收到回送的数据后显示出来。

要求:

完成TCP的客户、服务器程序;

服务器的固定端口号为20000。

具体原理不想写了  

因为实验报告是手写的  不是电子档  

这个老师很特别  大家都这么说  

具体代码:

客服端代码:

#pragma comment(lib,"ws2_32.lib")
#include<Winsock2.h>
#include<stdio.h>
#include<string.h>
#include<memory.h>

int main()
{
	WSAData wsaData;
	int err=WSAStartup(WINSOCK_VERSION,&wsaData);
	if(0!=err)
	{
		return -1;
	}
	SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
	
	if(INVALID_SOCKET==sock)
	{
		printf("socket()Failed:%d\n",WSAGetLastError());
		WSACleanup();
		return -1;
	}
	
	sockaddr_in ServerAddr;
	ServerAddr.sin_family=AF_INET;
	ServerAddr.sin_port=htons(20000);
	ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
	
	err=connect(sock,(sockaddr*)&ServerAddr,sizeof(ServerAddr));
	
	
	printf("%d\n",sock);
	
	if(SOCKET_ERROR == err)
	{
		printf("connect()Failed:%d\n",WSAGetLastError());
		closesocket(sock);
		WSACleanup();
		return -1;
	}
	
	char data[]="Hello World!";
	int sByte=send(sock,data,strlen(data),0);
	
	if(SOCKET_ERROR==sByte)
	{
		printf("send()Failed:%d\n",WSAGetLastError());
		closesocket(sock);
		WSACleanup();
		return -1;
	}
	
	shutdown(sock,SD_SEND);
	char rbuf[1024];
	
	while(1)
	{
		memset(rbuf,0,1024);
		int rByte=recv(sock,rbuf,1024,0);
		if(SOCKET_ERROR==rByte)
		{
			printf("recv()Failed:%\n",WSAGetLastError());
			closesocket(sock);
			WSACleanup();
			return -1;
		}
		if(0==rByte)
		{
			printf("Connection is closed.\n");
			break;
		}
		printf("TCP recv[%d]DATA:%s\n",rByte,rbuf);
	}
	
	closesocket(sock);
	WSACleanup();
	return 0;
}

服务器端代码:

#include <winsock2.h>
#include <stdio.h>
#include <memory.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
	WSAData wsaData;
	int err = WSAStartup(WINSOCK_VERSION,&wsaData);
	if(0 != err)
	{
		return -1;
	}
	SOCKET sock = socket (AF_INET,SOCK_STREAM,0);
	if(INVALID_SOCKET == sock)
	{
		printf("socket() Failed : %d\n",WSAGetLastError());
		WSACleanup();
		return -1;
	}
	
	sockaddr_in LocaAddr;
	LocaAddr.sin_family = AF_INET;
	LocaAddr.sin_port = htons (20000);
	LocaAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	
	
	err = bind(sock,(sockaddr*)&LocaAddr,sizeof (LocaAddr));
	printf("%d\n",sock);
	if(SOCKET_ERROR == err)
	{
		printf("bind() Failed :%d \n",WSAGetLastError);
		closesocket(sock);
		return -1;
		
	}
	
	err = listen(sock,5);
	if(SOCKET_ERROR == err)
	{
		printf("listen() Failed :%d\n",WSAGetLastError);
		closesocket(sock);
		WSACleanup();
		return -1;
	}
	
	sockaddr_in ClientAddr;
	int AddrLen = sizeof(ClientAddr);
	while(1)
	{
		SOCKET sockConnected = accept(sock,(sockaddr*)&ClientAddr, &AddrLen);
		if(INVALID_SOCKET == sockConnected)
		{
			printf("accpet() Failed :%d\n",WSAGetLastError);
			closesocket(sock);
			WSACleanup();
			return -1;
		}
		
		char rbuf[1024];
		while(1)
		{
			memset(rbuf,0,1024);
			
			int rByte = recv(sockConnected,rbuf,1024,0);
			if(SOCKET_ERROR ==rByte )
			{
				printf("recv() Failed: %d \n",WSAGetLastError);
				closesocket(sockConnected);
				break;
			}
			
			if(0 == rByte)
			{
				printf("Connection is closed.\n");
				shutdown(sockConnected,SD_SEND);
				closesocket(sockConnected);
				break;
			}
			
			printf("TCP recv [%d]DATA: %s\n",rByte,rbuf);
			
			int sByte = send(sockConnected,rbuf,rByte,0);
			if(SOCKET_ERROR == sByte)
			{
				printf("send()Failed: %d\n",WSAGetLastError());
				closesocket(sockConnected);
				break;
			}
		}
		
	}
	closesocket(sock);
	WSACleanup();
	return 0;
}

转载请说明出处

抱歉!评论已关闭.