Socket学习笔记

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);
网络字节转换为本地字节顺序(短整数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值