[Python] Socket 局域网通讯

最近几天的一些代码。

2017.10.3

IP.py

#!/usr/bin/python
import socket
 
host_name = socket.gethostname()
print "hostname:%s" % host_name
print "IP address: %s" % socket.gethostbyname(host_name)

MyServer.py [inter]

#!/usr/bin/python

#装载socket通讯
import socket

#设置本机socket
LocalSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#得到本机的ip地址
HostName = socket.gethostname()
print "服务器名称:%s" % HostName
HostIp = socket.gethostbyname(HostName)
print "IP 地址: %s" % HostIp

#为Socket寻找端口
for PortNow in range(1001,10000) :
    print "\n[Server] 正在尝试本机端口:", PortNow
    try :
        LocalSocket.bind(( HostIp , PortNow ))
        print "[Server]端口:",PortNow,"设置成功"
        break
    except Exception, e:
        print "[Server]本机端口:",PortNow,"设置失败"
        print Exception,":"
        print e

#最大连接数
LocalSocket.listen(5)

#Operating
while True :
    #输入操作Code
    OperateCode = int ( input("\n[Server] 请输入操作码:") )
    if OperateCode == -1 :
        print "[Server] 操作终止!"
        break
    else :
        print "[Server] OperateCode = ",OperateCode
    print "[Server] 正在等待建立连接..."
    #OperateCode functions
    """
    if OperateCode == 1 :
        print "[Server] Set time out for 10 second!"
        try :
            LocalSocket.settimeout(10)
            print "Set successfully"
        except Exception,e :
            print "Set timeout Error"
            print Exception,":"
            print e
    """
    #等待建立连接
    ClientSocket,Address = LocalSocket.accept()
    #输出连接信息
    print "[Server] 成功建立连接:"
    print ClientSocket," ",Address,"\n"
    #从用户收取2048b信息
    print "[Server] 等待客户的响应..."
    Message = ClientSocket.recv( 2048 )
    if Message != "" :
        print "[Server] 收到信息:",Message
    else :
        print "[Server] 未受到任何信息!"
    #向客户发送信息
    ClientSocket.send("{Server} Message get successfully!\n")
    #关闭与客户连接
    print "[Server] 关闭与客户的联系..."
    ClientSocket.close()

#ShutDown PortNow...
print "正在关闭本机端口..."
LocalSocket.close()

MyClient.py

#!/usr/bin/python

#装载一下socket通讯
import socket

#装载正则表达式
import re

#定义服务端对象
ServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#输入服务器的ip地址
HostIp = str( raw_input("[Client] Input host ip address:") )

#检测是否为本机
if re.match( "/localip",HostIp,re.I ) :
    print "You choose to use local Ip!"
    HostName = socket.gethostname()
    HostIp = socket.gethostbyname(HostName)
elif re.match( "/localhost",HostIp,re.I ) :
    print "You choose local host!"
    try :
        HostIp = socket.gethostbyname('localhost')
        print "get host ip successfully!"
    except Exception, e:
        print "Get host ip failed!"
        print Exception,":"
        print e,"\n"
        print "[Client] Choose local ip instead!"
        HostName = socket.gethostname()
        HostIp = socket.gethostbyname(HostName)
    print "[Client] This function is still under debug"

#输出确定的ip地址
print "[Client] host ip address:",HostIp

#输入当前端口
while True:
    PortNow=int(input("\n[Client] Please Input PortNow:"))
    #尝试设置端口
    try :
        ServerSocket.connect( ( HostIp , PortNow ) )
        print "access PortNow successfully!"
        #设置成功则退出
        break
    except Exception,e :
        print "PortNow is not accessable!"
        #输出错误信息
        print Exception,":"
        print e

#输入信息
Message = str( raw_input("[Client] Input Your Message:") )

#尝试向端口发送信息
try :
    ServerSocket.send( Message )
    print "[Client] Message send success!"
except Exception,e :
    print "[Client] Error when send a message to"
    print str(ServerSocket),"\n"
    
    #输出错误信息
    print Exception,":"
    print e

#接受服务端反馈2048b
try :
    FeedBack = ServerSocket.recv(2048)
    print "[Client] Get Feed Back!"
except Exception,e :
    print "[Client] Error When get feed back!"
    print Exception,":"
    print e

#输出反馈信息
if FeedBack == "" :
    print "[Client] no feed back!"
else :
    print "Feedback =",FeedBack
#关闭端口
ServerSocket.close()

2017.10.4

Server.py [ctnd]

#!/usr/bin/python

#正则表达式
import re

#局域网通信
import socket

#创建本地端口
LocalSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#得到本机的ip地址
host_name = socket.gethostname()
print "hostname:%s" % host_name
host_ip = socket.gethostbyname(host_name)
print "IP address: %s" % host_ip

#设置反馈状态
FeedBackMode = 0

#素数判断函数
def is_prime(num):
    #整数化
    num = long(num)
    if num <= 1 :
        return False
    if num == 2 :
        return True
    i = 2
    while i*i <= num :
        if num % i == 0 :
            return False
        i = i + 1
    return True

#检测指令
def InstructionCheck(Message) :
    #定义全局变量
    global FeedBackMode
    #分析指令标志
    if(Message[0]!='/') :return False
    if re.match("/float",Message,re.I) :
        print "[Instruction] /float"
        FeedBackMode = 0
        return True
    elif re.match("/sqrt",Message,re.I) :
        print "[Instruction] /sqrt"
        FeedBackMode = 1
        return True
    elif re.match("/prime",Message,re.I) :
        print "[Instruction] /prime"
        FeedBackMode = 2
        return True
    else :
        print "[Server] Unkonwn Instruction:",Message
        FeedBackMode = -1
        return True

#定义信息回应方式
def ReturnCode(Message) :
    if FeedBackMode == 0 :
        return str(float(Message)*2)
    elif FeedBackMode == 1 :
        return str(float(Message)**0.5)
    elif FeedBackMode == 2 :
        return str(is_prime(Message))
    else :
        return "[Server] FeedBackMode not defined!"

#最后确定的端口编号
PortSuc = 0

#检测并开启输出端口
for PortNow in range(1001,10000) :
    print "\n[Server] Try Port:",PortNow
    try :
        LocalSocket.bind(( host_ip , PortNow ))
        print "[Server] Set Successfully!"
        PortSuc = PortNow
        break
    except Exception,e :
        print "[Server] Port:",PortNow," not allowed..."
        print Exception,":"
        print e

#最大连接数
LocalSocket.listen(5)

#开始传输数据
print "[Server] Data Start..."
while True :
    #等待建立连接
    print "[Server] Wait for connection..."
    ClientSocket,Address = LocalSocket.accept()
    print "[Server] Get connection Sucessfully!"
    #输出连接信息
    print ClientSocket," ",Address,"\n"
    while True :
        #从用户端得到信息
        print "[Server] Wait for apply from Client..."
        Message = ClientSocket.recv(4096)
        #检测终止指令
        if re.match("/end",Message,re.I) :
            print "[Server] End instruction checked!"
            break
        #检测其他指令
        if InstructionCheck(Message) :
            print "change feedbackmode to:",FeedBackMode
            continue
        #检测非法终止
        if Message=="" :
            print "[Server] Get nothing!"
            break
        #输出反馈信息
        print "[Server] Get message:",Message
        RetCode = ReturnCode(Message)
        print "[Server] RetCode should be:",RetCode
        ClientSocket.send(RetCode)
    ClientSocket.close()
    break

LocalSocket.close()

Client.py [ctnd]

#!/usr/bin/python

#装载正则表达式
import re

#装载时间函数
import time

#装载通信
import socket

#定义服务端对象
ServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#输入服务器的ip地址
HostIp = str( raw_input("[Client] Input host ip address:") )

#检测是否为本机
if re.match( "/localip",HostIp,re.I ) :
    print "You choose to use local Ip!"
    HostName = socket.gethostname()
    HostIp = socket.gethostbyname(HostName)
elif re.match( "/localhost",HostIp,re.I ) :
    print "You choose local host!"
    try :
        HostIp = socket.gethostbyname('localhost')
        print "get host ip successfully!"
    except Exception, e:
        print "Get host ip failed!"
        print Exception,":"
        print e,"\n"
        print "[Client] Choose local ip instead!"
        HostName = socket.gethostname()
        HostIp = socket.gethostbyname(HostName)
    print "[Client] This function is still under debug"

#输出确定的ip地址
print "[Client] host ip address:",HostIp

#输入当前端口
while True:
    PortNow=int(input("\n[Client] Please Input PortNow:"))
    #尝试设置端口
    try :
        ServerSocket.connect( ( HostIp , PortNow ) )
        print "access PortNow successfully!"
        #设置成功则退出
        break
    except Exception,e :
        print "PortNow is not accessable!"
        #输出错误信息
        print Exception,":"
        print e

#开始数据传送
while True :
    #数据传送测试
    for i in range(1001,1021) :
        if (i%2==1) :
            #对奇数判断是否是质数
            print "[Client] send message:","/prime"
            ServerSocket.send("/prime")
        else :
            #对偶数开平方根
            print "[Client] send message:","/sqrt"
            ServerSocket.send("/sqrt")
        print "[Client] send message:",str(i)
        #等待反应0.2s
        time.sleep(0.2)
        ServerSocket.send(str(i))
        #接收反馈4096b
        print "[Client] Wait feedback..."
        FeedBack=ServerSocket.recv(4096);
        print "[Client] feedback:",FeedBack
    #终止数据传输
    print "[Client] send End flag"
    ServerSocket.send('/end')
    break

#关闭端口
ServerSocket.close()


2017.10.5

Receiver.py [msgcon]

#!/usr/bin/python

#正则表达式
import re

#局域网通信
import socket

#创建本地端口
LocalSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#输出错误信息
def SendErrMsg(message,exception,e) :
    if message!="" :print message
    print "解释器给出的错误原因如下:"
    print exception,":"
    print e

#暂停程序
def Pause() :
    raw_input("请按任意键继续...")

#得到本机的ip地址
def GetHostIp(Tip = True) :
    if Tip == True : print "\n[服务端] 正在尝试获得本机IP地址..."
    #定义变量
    host_name = ""
    host_ip = ""
    #尝试获得本机名称
    try :
        host_name = socket.gethostname()
        if Tip == True : print "当前名称:%s" % host_name
    except Exception,e :
        #出错
        SendErrMsg("[服务端] 获得本机名称时出错",Exception,e)
        Pause()
    #尝试得到本机IP地址
    try :
        host_ip = socket.gethostbyname(host_name)
        if Tip == True : print "当前IP地址: %s" % host_ip
    except Exception,e :
        #出错
        SendErrMsg("[服务端] 获得本机IP地址时出错",Exception,e)
        Pause()
    if Tip == True : print "成功获得本机IP地址:[",host_ip,"]"
    return host_ip

#检测并开启输出端口
def StartLocalSocket(HostIp,Tip = True) :
    if Tip == True : print "\n[服务端] 检测并开启输出端口..."
    #尝试端口
    PortSuc = 0
    for PortNow in range( 1001, 10000) :
        if Tip == True : print "\n正在尝试端口:",PortNow
        try :
            LocalSocket.bind(( HostIp , PortNow ))
            if Tip == True : print "[服务端] 设置成功,端口为:[",PortNow,"]"
            #记录成功的端口号
            PortSuc = PortNow
            break
        except Exception,e :
            if Tip == True : print "端口:",PortNow," 不可用..."
            if Tip == True : SendErrMsg("",Exception,e)
    #输出[成功/失败]信息
    if PortSuc != 0 :
        if Tip == True : print "[服务端] 设置成功!"
        return True
    else :
        if Tip == True :
            print "[服务端] 设置失败!"
            Pause()
        return False

#尝试着连接到客户端
def TryConnection() :
    print "[服务端] 正在尝试建立连接..."
    #得到当前的IP地址
    HostIpNow = GetHostIp()
    #检测并开启输出端口
    StartLocalSocket(HostIpNow)
    #最大连接数
    LocalSocket.listen(5)
    #等待用户连接
    print "[服务端] 等待用户连接..."
    #设置超时时限
    socket.setdefaulttimeout(20)
    try :
        ClientSocket,Address = LocalSocket.accept()
        print "成功得到与客户端的连接,IP地址:[",Address,"]"
    except Exception,e :
        SendErrMsg("[服务端] 等待连接超时",Exception,e)
        return False
    #信息交换
    print "[服务端] 开始接受信息..."
    while True :
        try :
            ClntMsg = ClientSocket.recv(4096)
            print ClntMsg
        except Exception,e :
            SendErrMsg("[服务端] 连接超时",Exception,e)
            break
        if re.match( "/end",ClntMsg, re.I ) :
            print "[服务端] 检测到文件终止符"
            break
    #关闭端口
    ClientSocket.close()
    LocalSocket.close()
    #成功结束一次连接
    return True

#主程序从这里开始,程序注释
"""
这是这个程序主程序的开始
编写时间:2017.10.5
程序作者:NEYC GGN
"""

#尝试建立连接
TryConnection()

ClientDebug.py [msgcon]

#!/usr/bin/python

#装载正则表达式
import re

#装载时间函数
import time

#装载通信
import socket

#定义服务端对象
ServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#输入服务器的ip地址
HostIp = str( raw_input("[Client] Input host ip address:") )

#检测是否为本机
if re.match( "/localip",HostIp,re.I ) :
    print "You choose to use local Ip!"
    HostName = socket.gethostname()
    HostIp = socket.gethostbyname(HostName)
elif re.match( "/localhost",HostIp,re.I ) :
    print "You choose local host!"
    try :
        HostIp = socket.gethostbyname('localhost')
        print "get host ip successfully!"
    except Exception, e:
        print "Get host ip failed!"
        print Exception,":"
        print e,"\n"
        print "[Client] Choose local ip instead!"
        HostName = socket.gethostname()
        HostIp = socket.gethostbyname(HostName)
    print "[Client] This function is still under debug"

#输出确定的ip地址
print "[Client] host ip address:",HostIp

#输入当前端口
while True:
    PortNow=int(input("\n[Client] Please Input PortNow:"))
    #尝试设置端口
    try :
        ServerSocket.connect( ( HostIp , PortNow ) )
        print "access PortNow successfully!"
        #设置成功则退出
        break
    except Exception,e :
        print "PortNow is not accessable!"
        #输出错误信息
        print Exception,":"
        print e

#开始数据传送
while True :
    #数据传送测试
    for i in range(1001,1021) :
        try:
            if (i%2==1) :
                #对奇数判断是否是质数
                print "[Client] send message:","/prime"
                ServerSocket.send("/prime")
            else :
                #对偶数开平方根
                print "[Client] send message:","/sqrt"
                ServerSocket.send("/sqrt")
            #等待延时
            time.sleep(0.1)
            print "[Client] send message:",str(i)
            ServerSocket.send(str(i))
            time.sleep(0.1)
        except Exception,e :
            print "[Client] Can't Connet to Server!"
            print Exception,":"
            print e
            break;
        """
        #接收反馈4096b
        print "[Client] Wait feedback..."
        FeedBack=ServerSocket.recv(4096);
        print "[Client] feedback:",FeedBack
        """
    #终止数据传输
    try :
        print "[Client] send End flag"
        ServerSocket.send('/end')
    except Exception,e :
        print "[Client] Can't Connet to Server!"
        print Exception,":"
        print e
    break

#关闭端口
ServerSocket.close()

2017.10.7

给出两个同于import引用的文件。

MyClient.py

#!/usr/bin/python
# -*- encoding: gb2312 -*-

#装载正则表达式
import re

#装载时间函数
import time

#装在通信
import socket

#定义服务端对象
ServerSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#暂停程序
def Pause() :
    raw_input("请按任意键继续...")

#输出错误信息
def SendErrMsg(message,exception,e) :
    if message!="" :print message
    print "解释器给出的错误原因如下:"
    print exception,":"
    print e

#得到本机的ip地址
def GetHostIp(Tip = False) :
    if Tip == True : print "\n正在尝试获得本机IP地址..."
    #定义变量
    host_name = ""
    host_ip = ""
    #尝试获得本机名称
    try :
        host_name = socket.gethostname()
        if Tip == True : print "当前名称:%s" % host_name
    except Exception,e :
        #出错
        SendErrMsg("获得本机名称时出错",Exception,e)
        Pause()
    #尝试得到本机IP地址
    try :
        host_ip = socket.gethostbyname(host_name)
        if Tip == True : print "当前IP地址: %s" % host_ip
    except Exception,e :
        #出错
        SendErrMsg("获得本机IP地址时出错",Exception,e)
        Pause()
    if Tip == True : print "成功获得本机IP地址:[",host_ip,"]"
    return host_ip

#输入IP地址
def IpInput() :
    HostIp = raw_input("请输入IP地址:")
    #检测是否为本机
    if re.match("/localip$",HostIp,re.I) :
        #得到本机地址
        HostIp = GetHostIp(False)
    elif re.match("/localhost$",HostIp,re.I) :
        #得到localhost地址
        HostIp = socket.gethostbyname('localhost')
    print "IP 地址为:",HostIp
    return HostIp

#向指定端口输出信息
def SendMsg(HostIp,PortNow,Msg) :
    print "正在尝试连接端口..."
     #尝试设置端口
    try :
        ServerSocket.connect( ( HostIp , PortNow ) )
        print "成功和端口建立联系!"
        #设置成功则退出
    except Exception,e :
        print "此端口不可用!"
        #输出错误信息
        print Exception,":"
        print e
        return False
    #尝试向端口输出信息
    try :
        ServerSocket.send(Msg)
        print "信息输出成功!"
    except Exception,e :
        print "信息输出失败!"
        print Exception,":"
        print e
    return True

#得到一个文件的全部内容
def GetFileText(FileName) :
    Fp = open(FileName,"r")
    try :
        #读取全部内容
        Text = Fp.read(-1)
    except Exception,e :
        print "文件[",FileName,"]无法读取!"
        return ""
    return Text

MyServer.py

#!/usr/bin/python
# -*- encoding: gb2312 -*-

#正则表达式
import re

#局域网通信
import socket

#创建本地端口
LocalSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#输出错误信息
def SendErrMsg(message,exception,e) :
    if message!="" :print message
    print "解释器给出的错误原因如下:"
    print exception,":"
    print e

#暂停程序
def Pause() :
    raw_input("请按任意键继续...")

#得到本机的ip地址
def GetHostIp(Tip = False) :
    if Tip == True : print "\n正在尝试获得本机IP地址..."
    #定义变量
    host_name = ""
    host_ip = ""
    #尝试获得本机名称
    try :
        host_name = socket.gethostname()
        if Tip == True : print "当前名称:%s" % host_name
    except Exception,e :
        #出错
        SendErrMsg("获得本机名称时出错",Exception,e)
        Pause()
    #尝试得到本机IP地址
    try :
        host_ip = socket.gethostbyname(host_name)
        if Tip == True : print "当前IP地址: %s" % host_ip
    except Exception,e :
        #出错
        SendErrMsg("获得本机IP地址时出错",Exception,e)
        Pause()
    if Tip == True : print "成功获得本机IP地址:[",host_ip,"]"
    return host_ip

#检测并开启输出端口
def StartLocalSocket(HostIp, Range = range(1001, 10000), Tip = False) :
    if Tip == True : print "\n检测并开启输出端口..."
    #尝试端口
    PortSuc = 0
    for PortNow in Range :
        if Tip == True : print "\n正在尝试端口:",PortNow
        try :
            LocalSocket.bind(( HostIp , PortNow ))
            if Tip == True : print "设置成功,端口为:[",PortNow,"]"
            #记录成功的端口号
            PortSuc = PortNow
            break
        except Exception,e :
            if Tip == True : print "端口:",PortNow," 不可用..."
            if Tip == True : SendErrMsg("",Exception,e)
    #输出[成功/失败]信息
    if PortSuc != 0 :
        if Tip == True : print "设置成功!"
        return True
    else :
        if Tip == True :
            print "设置失败!"
            Pause()
        return False

#尝试着连接到客户端
def TryConnection() :
    print "正在尝试建立连接..."
    #得到当前的IP地址
    HostIpNow = GetHostIp()
    #检测并开启输出端口
    StartLocalSocket(HostIpNow)
    #最大连接数
    LocalSocket.listen(5)
    #等待用户连接
    print "等待用户连接..."
    #设置超时时限
    socket.setdefaulttimeout(20)
    try :
        ClientSocket,Address = LocalSocket.accept()
        print "成功得到与客户端的连接,IP地址:[",Address,"]"
    except Exception,e :
        SendErrMsg("等待连接超时",Exception,e)
        return False
    #信息交换
    #定义输出方式
    OutputMode = ""
    print "开始接受信息..."
    while True :
        #尝试读入
        try :
            ClntMsg = ClientSocket.recv(4096)
        except Exception,e :
            SendErrMsg("连接超时",Exception,e)
            break
        #检测指令
        if re.match( "/end$",ClntMsg, re.I ) :
            print "检测到文件终止符"
            break
        elif re.match( "/file ",ClntMsg, re.I ) :
            FilePath = ClntMsg[6:]
            print "重定向文件为 ",FilePath
            if type(OutputMode)==file :
                OutputMode.close()
            OutputMode = open(FilePath,"w")
            continue
        #输出非指令信息
        if OutputMode== "" :
            print ClntMsg
        else :
            OutputMode.write(ClntMsg)
    #关闭输出文件
    if type(OutputMode) == file :
        OutputMode.close()
    #关闭端口
    ClientSocket.close()
    LocalSocket.close()
    #成功结束一次连接
    return True

2018.1.26

来一个C语言版本的头文件

PracticalSocket.hpp

#include<cstdio>
#include<windows.h>
#pragma comment(lib, "ws2_32.lib")
#define DELAY (200)

int ContractHost(const char* sendData,char* recData,int recLen){ //给服务器发送信息 
	
	WORD sockVersion = MAKEWORD(2, 2);//一些初始的东西 
    WSADATA data;
    if(WSAStartup(sockVersion, &data)!=0)return -2;//创建失败 
    
	SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(sclient == INVALID_SOCKET)return -1;//创建失败
	
	sockaddr_in serAddr;//尝试与主机建立连接 
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8888);
    serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//主机
	
	if(connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)  
	{ 
	    closesocket(sclient);
	    return -3;//连接失败,一般为主机不存在
	    #define HOST_NOT_EXIST (-3)
	}
	
	send(sclient, sendData, strlen(sendData), 0);
	Sleep(DELAY);
	int ret = recv(sclient, recData, recLen, 0);  
    recData[ret] = 0x00;//set EOS
    closesocket(sclient);
    
    WSACleanup();//最后的一些处理 
    
	return 0;//通信成功
	#define CONTRACT_SUC (0)
}

class ServerSocket{//服务端被以类的形式定义 
	WORD sockVersion;    
    WSADATA wsaData;
    SOCKET slisten;
    sockaddr_in sin;
    SOCKET sClient;
    sockaddr_in remoteAddr;
    int nAddrlen;   
    
    public:
    int InitServer(){//启动 
		sockVersion = MAKEWORD(2,2);
		if(WSAStartup(sockVersion, &wsaData)!=0)
			return -1;//fail
		
		slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    
	    if(slisten == INVALID_SOCKET)    
	        return -2;//socket error  
	    
	    
	    sin.sin_family = AF_INET;//绑定IP和端口  
	    sin.sin_port = htons(8888);
	    sin.sin_addr.S_un.S_addr = INADDR_ANY;// 127.0.0.1
	    if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)    
	        return -3;//bind error
	    
	    if(listen(slisten, 5) == SOCKET_ERROR)//开始监听 
		    return -4;//listen error
		    
	    nAddrlen = sizeof(remoteAddr);//准备循环接收数据 
		return 0;//suc
	}
	int WaitMessage(char* revData,int recLen){
		sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);//等待连接
		if(sClient == INVALID_SOCKET) return -1;//accept error
		//inet_ntoa(remoteAddr.sin_addr) 接受到的地址的字符串 
		int ret = recv(sClient, revData, recLen, 0);
        revData[ret] = 0x00;//set EOS
	}
	void Feedback(const char* sendData){//反馈一段信息 
        send(sClient, sendData, strlen(sendData), 0);    
        Sleep(DELAY);//try this
        closesocket(sClient);
	}
	void DestructHost(){//结束一个服务器 
		closesocket(slisten);    
    	WSACleanup();    
	}
};

编译的时候要加 -lwsock32 命令。

2018.1.28

//2018.1.28
#include<cstdio>
#include<windows.h>
#pragma comment(lib, "ws2_32.lib")  

int ContractHost(const char* sendData,char* recData,int recLen,const char* DNS){ //给服务器发送信息 这里加了一个参数DNS
	
	WORD sockVersion = MAKEWORD(2, 2);//一些初始的东西 
    WSADATA data;
    if(WSAStartup(sockVersion, &data)!=0)return -2;//创建失败 
    
	SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(sclient == INVALID_SOCKET)return -1;//创建失败
	
	sockaddr_in serAddr;//尝试与主机建立连接 
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8888);
    serAddr.sin_addr.S_un.S_addr = inet_addr(DNS);//主机
	
	if(connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)  
	{ 
	    closesocket(sclient);
	    return -3;//连接失败,一般为主机不存在
	    #define HOST_NOT_EXIST (-3)
	}
	
	send(sclient, sendData, strlen(sendData), 0);
	int ret = recv(sclient, recData, recLen, 0);  
    recData[ret] = 0x00;//set EOS
    closesocket(sclient);
    
    WSACleanup();//最后的一些处理 
    
	return 0;//通信成功
	#define CONTRACT_SUC (0)
}

class ServerSocket{//服务端被以类的形式定义 
	WORD sockVersion;    
    WSADATA wsaData;
    SOCKET slisten;
    sockaddr_in sin;
    SOCKET sClient;
    sockaddr_in remoteAddr;
    int nAddrlen;   
    
    public:
    int InitServer(){//启动 
		sockVersion = MAKEWORD(2,2);
		if(WSAStartup(sockVersion, &wsaData)!=0)
			return -1;//fail
		
		slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    
	    if(slisten == INVALID_SOCKET)    
	        return -2;//socket error  
	    
	    
	    sin.sin_family = AF_INET;//绑定IP和端口  
	    sin.sin_port = htons(8888);
	    sin.sin_addr.S_un.S_addr = INADDR_ANY;// 127.0.0.1
	    if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)    
	        return -3;//bind error
	    
	    if(listen(slisten, 5) == SOCKET_ERROR)//开始监听 
		    return -4;//listen error
		    
	    nAddrlen = sizeof(remoteAddr);//准备循环接收数据 
		return 0;//suc
	}
	int WaitMessage(char* revData,int recLen){
		sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);//等待连接
		if(sClient == INVALID_SOCKET) return -1;//accept error
		//inet_ntoa(remoteAddr.sin_addr) 接受到的地址的字符串 
		int ret = recv(sClient, revData, recLen, 0);
        revData[ret] = 0x00;//set EOS
	}
	void Feedback(const char* sendData){//反馈一段信息 
        send(sClient, sendData, strlen(sendData), 0);    
        closesocket(sClient);
	}
	void DestructHost(){//结束一个服务器 
		closesocket(slisten);    
    	WSACleanup();    
	}
};

#include<cstdlib>
#include<cstring>
#define clear(A) memset(A,0x00,sizeof(A))
char recData[256];
int main(){
	while(1){
		clear(recData);
		int t=ContractHost("hello world!",recData,255,"192.168.99.151");
		printf("%s\n%d\n",recData,t);
		system("pause");
	}
	return 0;
}

稍微改了一点点。

//2018.9.24
#include<cstdio>
#include<windows.h>
#pragma comment(lib, "ws2_32.lib")  

int ContractHost(const char* sendData,char* recData,int recLen,const char* DNS, int portnum){ //给服务器发送信息 
	
    WORD sockVersion = MAKEWORD(2, 2);//一些初始的东西 
    WSADATA data;
    if(WSAStartup(sockVersion, &data)!=0)return -2;//创建失败 
    
	SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(sclient == INVALID_SOCKET)return -1;//创建失败
	
	sockaddr_in serAddr;//尝试与主机建立连接 
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(portnum);
    serAddr.sin_addr.S_un.S_addr = inet_addr(DNS);//主机
	
	if(connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)  
	{ 
	    closesocket(sclient);
	    return -3;//连接失败,一般为主机不存在
	    #define HOST_NOT_EXIST (-3)
	}
	
	send(sclient, sendData, strlen(sendData), 0);
	int ret = recv(sclient, recData, recLen, 0);  
    recData[ret] = 0x00;//set EOS
    closesocket(sclient);
    
    WSACleanup();//最后的一些处理 
    
	return 0;//通信成功
	#define CONTRACT_SUC (0)
}

class ServerSocket{//服务端被以类的形式定义 
	WORD sockVersion;    
    WSADATA wsaData;
    SOCKET slisten;
    sockaddr_in sin;
    SOCKET sClient;
    sockaddr_in remoteAddr;
    int nAddrlen;   
    
    public:
    int InitServer(const char* ipname, int portnum){ //启动  // ipname = 本机IP地址
		sockVersion = MAKEWORD(2,2);
		if(WSAStartup(sockVersion, &wsaData)!=0)
			return -1;//fail
		
		slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    
	    if(slisten == INVALID_SOCKET)    
	        return -2;//socket error  
	    
	    
	    sin.sin_family = AF_INET;//绑定IP和端口  
	    sin.sin_port = htons(portnum);
	    sin.sin_addr.S_un.S_addr = inet_addr(ipname);
	    if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)    
	        return -3;//bind error
	    
	    if(listen(slisten, 5) == SOCKET_ERROR)//开始监听 
		    return -4;//listen error
		    
	    nAddrlen = sizeof(remoteAddr);//准备循环接收数据 
		return 0;//suc
	}
	const char* WaitMessage(char* revData,int recLen){
		sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);//等待连接
		if(sClient == INVALID_SOCKET) return (const char *)NULL;//accept error
		//inet_ntoa(remoteAddr.sin_addr) 接受到的地址的字符串 
		int ret = recv(sClient, revData, recLen, 0);
        revData[ret] = 0x00;//set EOS
        return inet_ntoa(remoteAddr.sin_addr);
	}
	void Feedback(const char* sendData){//反馈一段信息 
        send(sClient, sendData, strlen(sendData), 0);    
        closesocket(sClient);
	}
	void DestructHost(){//结束一个服务器 
		closesocket(slisten);    
    	WSACleanup();    
	}
};

又稍微改了一点。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值