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掉...