1.Socket函数
socket
Socket socket(int af, int type, int protocol);
af:使用的协议族 //AF_INET
type:Socket类型 //SOCK_STREAM(流) SOCK_DGRAM(数据报)
protocol:使用的协议地址 //0
e.g.
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
成功返回一个Socket描述字,否则返回
INVALID_SOCKET
connect
int connect(SOCKET s, const struct sockaddr* name, int namelen);
s:Socket描述字
name:远端地址 //SOCKADDR结构体
namelen:远端地址的长度
struct sockaddr_in{
short sin_fimaily; //Socket族
u_short sin_port; //端口
struct in_addr sin_addr; //IP地址
char sin_zero[8]; //结构的长度
};
e.g.
SOCKET s;
SOCKADDR_IN ServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_arrd(“127.0.0.1”);
connect(s, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));
成功返回0,否者返回SOCKET_ERROR.对于非阻塞模式的Socket连接,返回结果通常都是SOCKET_ERROR,并且错误代码为WSAEWOULDBLOCK,表示连接正在进行,而不是一个真正的错误
send
int send(SOCKET s, const char* buf, int len, int flags);
s:Socket套接字
buf:存放发送数据的缓冲区
len:将要发送的数据长度
flags:将要发送的数据长度
成功返回值为成功发送的字节数,否则返回SOCKET_ERROR
recv
int recv(SOCKET s, char* buf, int len, int flags);
s:Socket套接字
buf:存放接受数据的缓冲去
len:接收缓冲区的大小
flags:接收时使用的附加标志
接收数据成功,函数返回接收的字节数,否则,返回SOCKET_ERROR
closesocket
int closesocket(SOCKET s);
关闭成功,返回0,否则返回SOCKET_ERROR
listen
int listen(SOCKET s, int backlog);
s:SOCKET套接字
backlog:缓存队列的长度 //SOMAXCONN
如果建立监听成功,返回0,否则返回SOCKET_ERROR
accept
Socket accept(SOCKET s, struct sockaddr* addr, int* addrlen);
s:监听中的Socket
addr:表示地址结构体的指针
addrlen:地址结构体的长度
接收连接成功,函数返回一个心的Socket套接字,否则返回SOCKET_ERROR
bind
int bind(SOCKET s, const struct sockaddr* name, int namelen);
s:Socket套接字
name:表示地址结构体的指针
namelen:地址结构体的长度
函数执行成功,返回0; 否则返回SOCKET_ERROR.
select
int select(int nfds fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timevar* timeout);
nfds:Winsock中次参数无意义
readfds:进行可读检测的Socket
writefds:进行可写检测的Socket
exceptfds:进行异常检测的Socket
timeout:非阻塞模式中这只的最大等待时间
函数执行成功返回0,否则返回SOCKET_ERROR
2.IP地址转换
整数地址到ASCII地址的相互转换
#include “arpa/inet.h”
int inet_aton(const char* straddr, struct in_arrd* adrp);
返回:0表示转换不成功;1表示转换成功
char* inet_ntoa(struct in_addr inaddr);
返回: NULL表示转换不成功;其他返回值表示转换成功
inet_aton是将ASCII地址转换成整数地址,而inet_ntoa是相反的转换
域名地址与整数地址相互转换
#include “netdb.h”
struct hostent* gethostbyname(const char* name);
struct hostent* gethostbyaddr(const char* addr, int len, int family);
3.字节转换
本地字节转换为网络字节
u_long PASCAL FAR htonl(IN u_long hostlong);
本地字节转换为网络字节顺序(长整数)
u_short PASCAL FAR htons(IN u_short hostshort);
本地字节转换为网络字节顺序(短整数)
网络字节转换为本地字节
u_long PASCAL FAR ntohl(IN u_long netlong);
网络字节转换为本地字节栓许(长整数)
u_short PASCAL FAR ntohs(IN u_short netshort);
网络字节转换为本地字节顺序(短整数)