腊月的季节

C语言网络编程

网络编程头文件

winsock2.h 需要包含WS2_32.lib
winsock.h 需要包含WSOCK32.lib
MSWSOCK.h 需要包含MSWSOCK.dll
宏指定参数
MAKEWORD(x,y) wVersionRequested,
服务器一个进程
socket()/WSASocket() -> 绑定(bind) -> 监听(listen) -> Accept/WSAAccept()
客户机进程
socket()/WSASocket() -> 地址解析 -> Connect()/WSAConnect()
客户端初始化一个套接字链接,向服务器发送SYN包,同时客户机将套接字置为SYN_SENT,服务器收到SYN包后回一个SYN-ACK客户机再回一个ACK,客户机此时状态置为ESTABLTSHED,如果服务器拒绝或超时,客户机自动变为close状态。如果服务器的套接字从本地接口的端口绑定起来变为监听状态 LISTENING。
主动关闭套接字会发送一个FIN包,套接字状态置为FIN_WAIT_1或FIN_WAIT_2或TIME_WAIT。
send/WSASend
WSASendDisconnect
recv/WSARecv
WSARecvDisconnect
shutdown
closesocket

反向连接客户端不断发送连接请求

定义需要连接服务器的必要信息
sockaddr_in结构体
结构体包括以下数据
sin_family ip类型AF_INET是ipv4 AF_INET6是ipv6
sin_addr.s_addr ip地址(htonl转换网络地址)
sin_port 需要连接的端口(htons转换端口)
加载套接字库
WSAStartup(MAKEWORD(2,2),&wsadata);
第一个参数是版本的意思2.2
定义特定的套接字
SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//TCP的ipv4的套接字
SOCK_STREAM TCP
SOCK_DGRAM UDP
SOCK_RAW 原始(接收所有数据包,嗅探)
通信协议 IPPROTO_TCP
把套接字连接到外部服务器
connect(sock,(struct sockaddr*)&sai,sizeof(struct sockaddr));
如果连接成功就发送信息
send(sock,Banner,sizeof(Banner),0);//Banner是发送的内容
recv(sock,PassBuf,sizeof(PassBuf)-1,0);//PassBuf是接收消息的内容

strnicmp

strnicmp(str1,str2,int);
比较str1和str2的前n个字符串字典序的大小,但是不区分字母大小写,当str1<str2时,返回值是-1 ; 当str1=str2时,返回值是0; 当str1>str2时,返回值是1。

DWORD

dword一个word两个字节,dword两个word四个字节。

SECURITY_ATTRIBUTES

SECURITY_ATTRIBUTES结构包含一个对象的安全描述符,并指定检索到指定这个结构的句柄是否是可继承的。这个结构为很多函数创建对象是提供安全性设置。

CreateThread

该函数在主线程的基础上创建一个新线程.
MSDN中CreateThread原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//初始栈大小
LPTHREAD_START_ROUTINE lpStartAddress,//线程函数的指针
LPVOID lpParameter,//向线程函数传递参数
DWORD dwCreationFlags,//CREATE_SUSPENDED创建一个挂起的线程,0:表示创建后立即激活
LPDWORD lpThreadId//保存新线程的ID
使用closeHandle关闭对象。

LPVOID

LPVOID,是一个没有类型的指针,也就是说你可以将LPVOID类型的变量赋值给任意类型的指针,比如在参数传递时就可以把任意类型传递给一个LPVOID类型为参数的方法,然后在方法内再将这个“任意类型”从传递时的“LPVOID类型”转换回来。

STARTUPINFO

STARTUPINFO用于指定新进程的主窗口特性的一个结构。
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop; //用于标识启动应用程序所在的桌面的名字。
LPTSTR lpTitle;//用于设定控制台窗口的名称。
DWORD dwX;
DWORD dwY; //用于设定应用程序窗口在屏幕上应该放置的位置的x 和y 坐标
DWORD dwXSize;
DWORD dwYSize; //用于设定应用程序窗口的宽度和长度
DWORD dwXCountChars;
DWORD dwYCountChars;//用于设定子应用程序的控制台窗口的宽度和高度
DWORD dwFillAttribute;//用于设定子应用程序的控制台窗口使用的文本和背景颜色
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2; //保留。必须被初始化为0
LPBYTE lpReserved2;//保留。必须被初始化为NULL
HANDLE hStdInput;
HANDLE hStdOutput;//用于设定供控制台输入和输出用的缓存的句柄。
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;

GetSystemDirectory

GetSystemDirectory获取系统目录

PROCESS_INFORMATION

在创建进程时相关的数据结构之一,该结构返回有关新进程及其主线程的信息。

CreateProcess

CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATIONlpProcessInformation
);
lpApplicationName
指向一个NULL结尾的、用来指定可执行模块的字符串。
lpCommandLine
指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。
lpProcessAttributes
指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
lpThreadAttributes
同lpProcessAttribute,不过这个参数决定的是线程是否被继承.通常置为NULL.
bInheritHandles
指示新进程是否从调用进程处继承了句柄。

ReadFile

BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字节数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped
//如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。
//该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);

热评文章