网络模式

给出一个链接

Linux网络编程函数

WSAStartup函数

int WSAStartup(
  WORD      wVersionRequired,
  LPWSADATA lpWSAData
);

参数

wVersionRequested
调用方可以使用的Windows套接字规范的最高版本。高位字节指定次要版本号;低位字节指定主版本号。

lpWSAData
指向WSADATA数据结构的指针,用于接收Windows套接字实现的详细信息。

补充:参数以lp开头时,说明需要的是一个指针
即:LPWSADATA 相当于 WSADATA*,这样我们就有两种写法

int main() {

	WORD wdVersion = MAKEWORD(2, 1);
	
	WSADATA wdSockMsg;
	WSAStartup(wdVersion,&wdSockMsg);

	return 0;
}
int main() {

	WORD wdVersion = MAKEWORD(2, 1);
	//WSADATA wdSockMsg;
	//WSAStartup(wdVersion,&wdSockMsg);

	LPWSADATA lpw = malloc(sizeof(WSADATA));
	WSAStartup(wdVersion, lpw);
	free(lpw);
	return 0;
}

return value

如果成功,WSAStartup函数将返回0。否则,它将返回下面列出的错误代码之一。

Error code Meaning

WSASYSNOTREADY

The underlying network subsystem is not ready for network communication.

WSAVERNOTSUPPORTED

The version of Windows Sockets support requested is not provided by this particular Windows Sockets implementation.

WSAEINPROGRESS

A blocking Windows Sockets 1.1 operation is in progress.

WSAEPROCLIM

A limit on the number of tasks supported by the Windows Sockets implementation has been reached.

WSAEFAULT

The lpWSAData parameter is not a valid pointer. 

版本校验

//校验版本
	if (2 == HIBYTE(wdSockMsg.wVersion) || 2 == LOBYTE(wdSockMsg.wVersion)) {
		
		printf("版本是2.2");
		WSACleanup();
		return 0;
	}

SOCKET

SOCKET本质就是一个整数,这个数是唯一的,标识当前的应用程序,协议信息等

socket函数

SOCKET WSAAPI socket(
  int af,		//地址类型
  int type,		//套接字类型
  int protocol	//协议类型
);

参数

af:地址类型

AF_INET		------	ipv4

AF_INET6	-----	ipv6

type:套接字类型

SOCK_STREAM-----------一种套接字类型,它通过OOB数据传输机制提供有序、可靠、
双向、基于连接的字节流。此套接字类型将传输控制协议(TCP)用于Internet地址系
列(AF_INET或AF_INET6)。


SOCK_DGRAM-------------一种支持数据报的套接字类型,数据报是固定(通常很小)
最大长度的无连接、不可靠的缓冲区。此套接字类型将用户数据报协议(UDP)用于
Internet地址系列(AF逯INET或AF_INET6)。

protocol:协议类型

IPPROTO_TCP------------传输控制协议(TCP)。当af参数为af_INET或af_INET6并且
类型参数为SOCK_STREAM时,这是一个可能的值。 

IPPROTO_UDP-----------用户数据报协议(UDP)。当af参数为af_INET或af_INET6且
类型参数为SOCK_DGRAM时,这是一个可能的值。

return value

如果没有发生错误,socket返回一个引用新套接字的描述符。否则,将返回一个无效的INVALID_SOCKET值,并可以通过调用WSAGetLastError来检索特定的错误代码。

bind函数

给我们的socket绑定端口号与具体地址

int WSAAPI bind(
  SOCKET         s,
  const sockaddr *name,
  int            namelen
);

参数

s

标识未绑定套接字的描述符。

name

指向要分配给绑定套接字的本地地址的sockaddr结构的指针。

namelen

name参数指向的值的长度(以字节为单位)。 

sockaddr 和sockaddr_in 内存排布是一样的,可以互相强制转换

struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;				//地址类型(要和socket函数参数1保持一致)
        u_short sin_port;				//端口号,可以使用htons宏来赋值
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

在这里插入图片描述

使用示例

struct sockaddr_in si;
	si.sin_family = AF_INET;
	si.sin_port = htons(12345);
	si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

bind(socketServer,(struct sockaddr *)&si,sizeof(si));

listen函数(设置监听上限,也是同时建立连接的上限)

int WSAAPI listen(
  SOCKET s,
  int    backlog
);

参数

s

标识绑定的、未连接的套接字的描述符。

backlog

挂起连接队列的最大长度。
如果设置为SOMAXCONN,负责套接字s的底层服务提供商将把backlog设置为最大合理值。

return value

  • 成功返回0;
  • 失败返回SOCKET_ERROR,返回的错误码,使用函数WSAGetLastError()返回错误码,之后记得关闭网络库和相应的socket

accept函数

accept函数允许在套接字上进行传入连接尝试。

此函数是阻塞的,没有客户端连接,那就一直卡在这儿

SOCKET WSAAPI accept(
  SOCKET   s,
  sockaddr *addr,
  int      *addrlen
);

参数

s

一种描述符,用于标识使用listen函数处于侦听状态的套接字。

addr

用来保存客户端套接字对应的“地方”(包括客户端IP和端口信息等)

addrlen

addr的大小

第二第三个参数也可以都设置为NULL,这样表示不需要得到client端的信息
当我们又需要信息的时候,可以调用函数

getpeername(newSocket,(struct sockaddr*)&sockcClient,&nLen)

return value

  • 如果没有发生错误,accept将返回SOCKET类型的值,该值是新套接字的描述符。此返回值是实际连接所在的套接字的句柄。
  • 否则,将返回一个INVALID_SOCKET值,并可以通过调用WSAGetLastError来检索特定的错误代码。

recv函数(阻塞)

注意:并不是调用recv函数后才会接受数据,不管有没有调用这个函数,服务器都会接受数据放入输入队列中,recv函数将数据取出来,放入指定的buf中

int WSAAPI recv(
  SOCKET s,
  char   *buf,
  int    len,
  int    flags
);

参数

s

对方的socket

buf

指向接收传入数据的缓冲区的指针。(一般1500字节)

len

buf参数指向的缓冲区的长度(字节),代表想要读取的字节数。

flags

flags参数可用于影响函数调用的行为

0----------读出来就从输入队列中删除读出来的字符
MSG_PEEK---------窥视传入的数据,将数据复制到buf中,但不会从输入队列中删除(不建议使用)
MSG_OOB----------传输一段数据,外带一段特殊数据(不建议使用)
MSG_WAITALL-----------直到系统缓冲区字节数满足参数3请求的字节数,才开始读取

return value

  • 如果没有发生错误,recv返回接收到的字节数,buf参数指向的缓冲区将包含接收到的数据。如果连接已正常关闭,则返回值为零。
  • 否则,将返回SOCKET_ERROR的值,并且可以通过调用WSAGetLastError检索特定的错误代码,并做相应处理(重启or等待,什么的)。
  • 客户端下线,则返回0

send函数

send函数将我们的数据赋值粘贴进系统的协议发送缓冲区,计算机伺机发送出去

int WSAAPI send(
  SOCKET     s,
  const char *buf,
  int        len,
  int        flags
);

参数

s

目标socket

buf

指向包含待传输数据的缓冲区的指针。

len

buf参数指向的缓冲区中数据的长度,以字节为单位。

flag

一般为0

return value

  • 如果没有发生错误,send将返回发送的总字节数,这个字节数可以小于len参数中要求发送的字节数
  • 否则,将返回一个SOCKET_ERROR的值,并且可以通过调用WSAGetLastError检索具体的错误代码。

connect函数

连接服务器,并且讲服务器信息与服务器socket绑定到一起

int WSAAPI connect(
  SOCKET         s,
  const sockaddr *name,
  int            namelen
);

参数

s

服务器socket

name

一个保存服务器信息的sockaddr结构体

namelen

参数2    sockaddr结构的长度,以字节为单位。

return value

  • 如果没有发生错误,connect返回0。
  • 否则,返回SOCKET_ERROR,具体的错误代码可以通过调用WSAGetLastError来检索。
  • 在阻塞的套接字上,返回值表示连接尝试的成功或失败。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值