【Socket编程】基于windows的套接字相关函数
WSAStartup()
一句话解释:wsastart的功能就是进行相应的socket库绑定
这里用通俗的语言解释一下这个函数,就类似于opencv一样,要添加链接库函数,cv.lib等,要添加到附加依赖项,或者通过#pragma comment(lib,”cv.lib“)一样,然后才能包含头文件进行各种函数的调用。当然了,socket编程要调用各种socket函数,但是需要库Ws2_32.lib和头文件Winsock2.h,这里的WSAStartup就是为了向操作系统说明,我们要用哪个库文件,让该库文件与当前的应用程序绑定,从而就可以调用该版本的socket的各种函数了。
header: Winsock2.h
library: Ws2_32.lib
原型:
#include
int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData);
//成功时返回0,失败时返回非零的错误代码值
参数:
wVersionRequested
是Windows Sockets API
提供的调用方可使用的最高版本号
。高位字节
指出副版本(修正)号
,低位字节
指明主版本号
。
lpWSAData
是指向WSADATA数据结构
的指针,用来接收Windows Sockets实现
的细节。
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。
例:假如一个程序要使用2.1版本的Socket,那么程序代码如下
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
//winsoc编程必备公式
int main(int argc,char* argv[]){
WSADATA wsaData;
...
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
ErrorHanding("WSAStartup() error!");
...
return 0;
}
WSACleanup()
一句话解释:wsacleanup的功能就是解除与socket库的绑定并且释放socket库所占用的系统资源
#include
int WSACleanup(void);
//成功时返回0,失败时返回SOCKER_ERROR
在Windows下,Socket是以DLL的形式实现的。在DLL内部维持着一个计数器,只有第一次调用WSAStartup才真正装载DLL,以后的调用只是简单的增加计数器,而WSACleanup函数的功能则刚好相反,每调用一次使计数器减1,当计数器减到0时,DLL就从内存中被卸载!因此,你调用了多少次WSAStartup,就应相应的调用多少次的WSACleanup.
socket函数
#include
SOCKET socket(int af,int type,int protocol);
//成功时返回套接字句柄,失败时返回INVALID_SOCKET.
bind函数
#include
int bind(SOCKET s,const struct sockaddr* name,int namelen);
//成功时返回0,失败时返回SOCKET_ERROR
listen函数
#include
int listen(SOCKET s,int backlog);
//成功时返回0,失败时返回SOCKET_ERROR
accept函数
#include
SOCKET accept(SOCKET s,struct sockaddr* adr,int * addrlen);
//成功时返回套接字句柄,失败时返回INVALID_SOCKET.
connect函数
#include
int connect(SOCKET s,const struct sockaddr * name,int namelen);
//成功时返回0,失败时返回SOCKET_ERROR
closesocket函数
#include
int closesocket(SOCKET s);
//成功时返回0,失败时返回SOCKET_ERROR
atoi函数
int atoi(const char *str);
/*C 库函数把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。*/
例如:
#include
#include
#include
int main()
{
int val;
char str[20];
strcpy(str, "98993489");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
strcpy(str, "runoob.com");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
return(0);
}
输出:
>>字符串值 = 98993489, 整型值 = 98993489
>>字符串值 = runoob.com, 整型值 = 0
send函数
#include
int send(SOCKET s,const char* buf,int len,int flags);
//成功时返回传输字节数,失败时返回SOCKER_ERROR
recv函数
#include
int recv(SOCKET s,const char* buf,int len,int flags);
//成功时返回传输字节数(收到EOF时为0),失败时返回SOCKER_ERROR
参考文章:
WSAStartUp详细的解释为什么首先调用这个函数_用户1259629212_新浪博客 (sina.com.cn)