echo服务的实现

echoserver.py


#!/usr/bin/env python

import socket
import os, sys

if len(sys.argv) != 2:
	print "<Usage: port>"
	sys.exit(1)

try:                  # get port 
	port = int(sys.argv[1])
except Exception, e:
	print "port is error for " + str(e)
	sys.exit(2)

try:                  # socket()
	serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except  socket.error, e:
	print "socket error happened! " + str(e)
	sys.exit(3)

host = '127.0.0.1'      # localhost

serversocket.bind((host, port))
serversocket.listen(5)

while True:            # endless loop
	clientsock, clientaddr = serversocket.accept()    # accept()
	if os.fork() == 0:
		serversocket.close()
		print 'Got connection from ',clientsock.getpeername() # getpeername()

		while True:
			try:
				message = clientsock.recv(1024)
			except (EOFError, IOError):  # One of the Errors
				print "Over!"
				break
			clientsock.send(message)
		clientsock.close()
		sys.exit(0)









echoclient.py:


#!/usr/bin/env python

import socket
import sys

if len(sys.argv) != 3:
	print "<Usage: Address port>"
	sys.exit(1)

try:
	port = int(sys.argv[2])                  # get port
except Exception, e:
	print "port is error for " + str(e)
	sys.exit(2)

try:                                        # socket()
	clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
	print "socket() error for " + str(e)

host = sys.argv[1]

try:
	clientsocket.connect((host, port))      # connect()
except socket.gaierror, e:
	print "Address error for " + str(e)
	sys.exit(3)
print "Connect to  " + sys.argv[1]

while True:

	try:
		message = raw_input("Input message to be sent: ")
	except (EOFError, KeyboardInterrupt):  # One of the Errors
		print "Over!"
		break
	clientsocket.send(message)
	print clientsocket.recv(1024)

clientsocket.close()
sys.exit(0)


windows:


server.cpp:


#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")
#define MAX 4096

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsaData;
	SOCKET sServer;
	SOCKET sClient;
	int retVal;
	char buf[MAX];


	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
	{
		printf("WSAStartup() error");
		return 1;
	}

	printf("Version: %d, %d\n",LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion));
	printf("HIgh Version: %d, %d\n",LOBYTE(wsaData.wHighVersion),HIBYTE(wsaData.wHighVersion));
	printf("Description %s\n",wsaData.szDescription);
	printf("System Status: %s\n",wsaData.szSystemStatus);

	

	getchar();

	sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (sServer == INVALID_SOCKET)
	{
		printf("socket() error");
		WSACleanup();
		return -1;
	}

	SOCKADDR_IN addrServ;

	addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //监听地址为INADDR_ANY
	addrServ.sin_port = htons(10000);              //端口为10000
	addrServ.sin_family = AF_INET;

	retVal = bind(sServer, (const struct sockaddr*) &addrServ, sizeof(SOCKADDR_IN));
	if (SOCKET_ERROR == retVal)
	{
		printf("bind() error");
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	retVal = listen(sServer, 1);
	if (SOCKET_ERROR == retVal)
	{
		printf("listen() error");
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	printf("TCP server start...\n");

	sockaddr_in addrClient;
	int addrClientLen = sizeof(addrClient);
	sClient = accept(sServer, (sockaddr FAR*) &addrClient, &addrClientLen);

	if (SOCKET_ERROR == retVal)
	{
		printf("accept() error");
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	while (1) 
	{
		ZeroMemory(buf, MAX);
		retVal = recv(sClient, buf, MAX, 0);
		if (SOCKET_ERROR == retVal)
		{
			printf("recv() error");
			closesocket(sServer);
			closesocket(sClient);
			WSACleanup();
			return -1;
		}

		SYSTEMTIME st; //获取系统时间
		GetLocalTime(&st);

		char sDateTime[30];
		sprintf(sDateTime, "%4d-%2d-%2d %2d:%2d:%2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
		printf("%s Recv from client [%s:%d] : %s\n", sDateTime, inet_ntoa(addrClient.sin_addr), addrClient.sin_port, buf);

		
		{
			char msg[MAX];
			sprintf(msg, "Message received- %s", buf);
			retVal = send(sClient, msg, strlen(msg), 0); //echo 字符串
			if (SOCKET_ERROR == retVal)
			{
				printf("send() error");
				closesocket(sServer);
				closesocket(sClient);
				WSACleanup();
				return -1;
			}
		}

		
	}
	closesocket(sServer);
	closesocket(sClient);
	WSACleanup();


	return 0;
}


client.cpp:


#include "stdafx.h"
#include <winsock2.h>
#include <string.h>
#include <iostream>

using namespace std;

#pragma comment(lib, "ws2_32.lib")
#define MAX 4096

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsd;
	SOCKET sHost;
	SOCKADDR_IN servAddr;
	char buf[MAX];
	int retVal;

	if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
	{
		printf("init() error\n");
		return 1;
	}

	sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == sHost)
	{
		printf("socket() error");
		WSACleanup();
		return -1;
	}
	printf("sHost is %d\n\n",sHost);
	//getchar();

	servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 

//localhost
	servAddr.sin_port = htons(10000);
	servAddr.sin_family = AF_INET;

	int sServerAddlen = sizeof(servAddr);
	retVal = connect(sHost, (LPSOCKADDR) &servAddr, sizeof

(servAddr));

	if (SOCKET_ERROR == retVal)
	{
		printf("connect() error");
		closesocket(sHost);
		WSACleanup();
		return -1;
	}

	while (1) 
	{
		printf("Input a string to send:");
		char str[MAX];
		fgets(str, MAX, stdin);
		ZeroMemory(buf, MAX);
		strcpy(buf, str); //将输入送入buf

		retVal = send(sHost, buf, strlen(buf), 0);
		if (SOCKET_ERROR == retVal)
		{
			printf("send() error");
			closesocket(sHost);
			WSACleanup();
			return -1;
		}

		buf[0] = 0;

		retVal = recv(sHost, buf, sizeof(buf)+1, 0);
		printf("Recv From Server: %s\n", buf);


	}


	closesocket(sHost);
	WSACleanup();


	return 0;
}



不过,我们的服务器实在太简单了,连普通的SYN Ping都会使他down掉...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值