windows下python和linux进行tcp连线

#Tcp连接
windows下面是用python3编译

#client python3
import socket
address=('14.116.214.241',8000)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(address)
str1 = 'hi0i111'
s.send(str1.encode())
data=s.recv(8192)
print('the server:',data)
s.close()

linux

client.c

/*gcc client.c -o client  然后,client hi*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
/*客户端*/
char *host_name ="127.0.0.1";//需要搜寻服务端IP地址
int port = 8000;

/*argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数
 * argv: 字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数
  argv[0] 指向程序运行的全路径名
  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串
  argv[2] 指向执行程序名后的第二个字符串
   */
int main(int argc, char** argv) {
char buf[8192];
char message[256];
int socket_descriptor;
struct sockaddr_in pin;//处理网络通信的地址
/*
 * hostent记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表
 * struct hostent {
     char *h_name;地址的正式名称
     char **h_aliases;空字节-地址的预备名称的指针
     int h_addrtype;地址类型; 通常是AF_INET。
     int h_length;地址的比特长度。
     char **h_addr_list;零字节-主机网络地址指针。网络字节顺序。
  };
     #define h_addr h_addr_list[0] //h_addr_list中的第一地址
 */
struct hostent *server_host_name;

char *str = "A default test string";

if(argc<2)//运行程序时送给main函数到命令行参数个数
{
printf("Usage:test \"Any test string\"\n");
printf("we will send a default test string. \n");
}
else
{
str =argv[1];
}
/*
 * gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的
 * hostent结构指针。结构的声明与gethostaddr()中一致。*/
if((server_host_name = gethostbyname(host_name))==0)
{
perror("Error resolving local host \n");
exit(1);
}

bzero(&pin,sizeof(pin));
pin.sin_family =AF_INET;
pin.sin_addr.s_addr=htonl(INADDR_ANY);//s_addr按照网络字节顺序存储IP地址
pin.sin_addr.s_addr=((struct in_addr *)(server_host_name->h_addr))->s_addr;// 跟书上不一样 必须是h_addr

pin.sin_port=htons(port);
/*申请一个通信端口*/
if((socket_descriptor =socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("Error opening socket \n");
exit(1);
}
if(connect(socket_descriptor,(void *)&pin,sizeof(pin))==-1)
{
perror("Error connecting to socket \n"); 
exit(1);
}
printf("Sending message %s to server \n",str);

if(send(socket_descriptor,str,strlen(str),0) == -1)
{
perror("Error in send\n");
exit(1);
}

printf("..sent message.. wait for response...\n");

if(recv(socket_descriptor,buf,8192,0) == -1)
{
perror("Error in receiving response from server \n");
exit(1);
}
printf("\n Response from server:\n\n%s\n",buf);
close(socket_descriptor);
return (EXIT_SUCCESS);
}

server.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h> 
#include <arpa/inet.h>
#include <netdb.h>
#include <ctype.h> 

int port =8000;

/*服务端*/
int main(int argc, char** argv) {
struct sockaddr_in sin;//struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。
struct sockaddr_in pin;
int sock_descriptor;//  套接口描述字
int temp_sock_descriptor;
int address_size;
char buf[16384];// 缓冲区大小
int i,len;
sock_descriptor=socket(AF_INET,SOCK_STREAM,0);//IPV4 TCP协议
if(sock_descriptor== -1)//申请失败
{
perror("call to socket");
exit(1);
}
bzero(&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr=INADDR_ANY;
sin.sin_port=htons(port);

if(bind(sock_descriptor,(struct sockaddr *)&sin,sizeof(sin)) ==-1)
{
perror("call to bind");
exit(1);
}

if(listen(sock_descriptor,20) == -1) //在端口sock_descriptor监听
{
perror("call to listen");
exit(1);
}

printf("accepting connections \n");

while(1)
{  
temp_sock_descriptor = accept(sock_descriptor,(struct sockaddr *)&pin, &address_size);
if(temp_sock_descriptor== -1)
{
   perror("call to accept");
   exit(1);
}

if(recv(temp_sock_descriptor,buf,16384,0) ==-1)
{
perror("call to recv");
exit(1);
}

printf("received from client:%s\n",buf);

len =strlen(buf);
for(i=0;i<len;i++)
{
buf[i]= toupper(buf[i]);
}

if(send(temp_sock_descriptor,buf,len,0) == -1)
{
perror("call to send");
exit(1);
}
close(temp_sock_descriptor);
}
return (EXIT_SUCCESS);
}

在这里插入图片描述

在这里插入图片描述

#UDP连接测试

client_udp.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'a socket example which send echo message to server.'

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in ['哈', 'Tracy', 'Sarah']:
    # 发送数据:
    s.sendto(data, ('14.116.214.241', 9999))
    # 接收数据:
    print s.recv(1024).decode(encoding='UTF-8')
s.close()

server_udp.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'a udp server example which send time to client.'

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 地址一定要0.0.0.0 也是 INADDR_ANY 。绑定端口:9999
s.bind(('0.0.0.0', 9999))
print 'Bind UDP on 9999...'
while True:
    # 接收数据:
    data, addr = s.recvfrom(1024)
    print 'Received from %s:%s.' %addr
    print data
    s.sendto('Hello, %s!' % data, addr)

再做个tcp连接。比较稳定的。
client_tcp.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
def main():
    # 1. 创建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 获取服务器的ip port
    dest_ip = '14.116.214.241'#raw_input("请输入下载服务器的ip:")
    dest_port = 7890#int(raw_input("请输入下载服务器的port:"))
    # 3. 链接服务器
    tcp_socket.connect((dest_ip, dest_port))

    # 4. 获取下载的文件名字
    download_file_name = raw_input("请输入发送信息:")
    # 5. 将文件名字发送到服务器
    tcp_socket.send(download_file_name)
    # 6. 接收文件中的数据
    recv_data = tcp_socket.recv(1024)  # 1024--->1K  1024*1024--->1k*1024=1M 1024*1024*124--->1G
    print("服务器过来的信息是:%s" % recv_data)
    #if recv_data:
        # 7. 保存接收到的数据到一个文件中
    #    with open("[新]" + download_file_name, "wb") as f:
    #        f.write(recv_data)
    # 8. 关闭套接字
    tcp_socket.close()
if __name__ == "__main__":
    main()

如果刚关闭server_tcp服务,要等一下,因为地址被占用,等一会才行。
刚vim server_tcp.py 需要 chmod 777 server_tcp.py
server_tcp.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
def main():
    # 1. 买个手机(创建套接字 socket)
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 插入手机卡(绑定本地信息 bind)
    tcp_server_socket.bind(("0.0.0.0", 7890))

    # 3. 将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动 listen)
    tcp_server_socket.listen(128)

    while True:
        print("等待一个新的客户端的到来...")
        # 4. 等待别人的电话到来(等待客户端的链接 accept)
        new_client_socket, client_addr = tcp_server_socket.accept()
        print("一个新的客户端已经到来%s" % str(client_addr))
        # 接收客户端发送过来的请求
        recv_data = new_client_socket.recv(1024)
        print("客户端福送过来的请求是:%s" % recv_data)
        # 回送一部分数据给客户端
        new_client_socket.send("hahahghai-----ok-----")
        # 关闭套接字
        # 关闭accept返回的套接字 意味着 不会在为这个客户端服务
        new_client_socket.close()
        print("已经服务器完毕。。。。")

    # 如果将监听套接字 关闭了,那么会导致 不能再次等待新客户端的到来,即xxxx.accept就会失败
    tcp_server_socket.close()
if __name__ == "__main__":
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值