概述
<废话>编程小白终于决定夯实基础,学了一下网络编程。注释有点烂,周末实在太累了,就没整理。。。困晕了。然后python本来是想实现xshell的小功能的,结果只能远程执行一条命令,应该是客户端缓冲区的问题,没调好,哎,是真的菜</废话>
<正文>
C语言服务端:
#pragma comment(lib,"ws2_32.lib") //该指令用来将w32_32.lib这个动态链接库文件加入到本工程中
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>
void main()
{
WSADATA wsaData; //存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
SOCKET listenSocket; //服务端用来监听的套接字
SOCKET sendSocket;
SOCKADDR_IN severAdress; //服务端地址 sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。而sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作。使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。
SOCKADDR_IN clientAdress; //客户端地址
int cilentAdressLen;
int PORT = 10001;
char dataBuffer[1024]; //缓存数据
int strLen;
/* struct sockaddr_in
{
short sin_family; 协议
u_short sin_port; 端口
struct in_addr sin_addr; 存储IP地址,使用in_addr这个数据结构 ,in_addr是一个结构体,可以用来表示一个32位的IPv4地址
char sin_zero[8]; 让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节
};*/
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //Windows Sockets Asynchronous的启动命令、Windows下的网络编程接口软件 Winsock1 或 Winsock2 里面的一个命令,前一个地址确定版本,后一个确定地址
{
printf("WSAtsrtup failed!n");
return;
}
if((listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET) //创建一个套接字,参数(地址类型,协议,协议编号)
//AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的;而 AF_UNIX 则是 Unix 系统本地通信。
//SOCK_STREAM,流类型,提供可靠连接,tcp
//IPPROTO_TCP 和 IPPROTO_IP代表两种不同的协议,分别代表IP协议族里面的TCP协议和IP协议
{
printf("socket faild!reason:%dn" ,WSAGetLastError());
WSACleanup(); //终止Winsock 2 DLL (Ws2_32.dll) 的使用
return;
}
severAdress.sin_family = AF_INET;
severAdress.sin_port = htons(PORT); //将主机的无符号短整形数转换成网络字节顺序 host to net short
severAdress.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //将一个32位数从主机字节顺序转换成网络字节顺序,允许任何服务端链接 host to net long
if (bind(listenSocket, (SOCKADDR*)&severAdress, sizeof(severAdress)) == SOCKET_ERROR) //将一本地地址与一套接口捆绑
{
printf( "bind error! reason:%dn" ,WSAGetLastError());
closesocket(listenSocket);
WSACleanup();
return;
}
if (listen(listenSocket, 5) == SOCKET_ERROR) //允许五个链接在队列
{
printf("listen failed!reason:%dn", WSAGetLastError);
closesocket(listenSocket);
WSACleanup();
return;
}
printf("i'm here to waiting for you:%dn",PORT);
printf("正在监听...");
cilentAdressLen = sizeof(clientAdress);
if ((sendSocket = accept(listenSocket, (SOCKADDR*)&clientAdress, &cilentAdressLen)) ==INVALID_SOCKET) //在一个套接口接受一个连接,参数:套接字描述符;指针,指向一缓冲区;指针 指向存有addr地址长度的整型数)
{
printf("accept faild! %dn",WSAGetLastError);
closesocket(listenSocket);
WSACleanup();
return;
}
printf("success");
printf("客户端ip地址:%s:%dn", inet_ntoa(clientAdress.sin_addr), ntohs(clientAdress.sin_port)); //inet_ntoa:将网络地址转换成“.”点隔的字符串格式 net to address,ntohs:将一个16位数由网络字节顺序转换为主机字节顺序
closesocket(listenSocket);
printf("we are waiting receive...n");
if((strLen=recv(sendSocket,dataBuffer,sizeof(dataBuffer),0))==SOCKET_ERROR)
{
printf("receive faild! reason:%dn", WSAGetLastError);
closesocket(sendSocket);
WSACleanup();
return;
}
printf("we have received %d bytesn", strLen);
dataBuffer[strLen] = '