Mac OS X下的网络编程(socket)的机制

本文详细介绍了C语言中Socket编程的基本概念和步骤,包括Socket的创建、类型、协议选择以及面向连接和无连接套接字的使用。同时,讲解了如何避免阻塞I/O,并对比了Unix和WinSock下的Socket实现差异。
摘要由CSDN通过智能技术生成

对于socket的机制来说,应该都是差不多的
如果用C来写的话,我给出一个简要说明

1.1 什么是Socket
Socket是网络文件描述符。在基于Socket的编程技术中,用户不直接访问发送和接收包的网络接口设备,而是建立一个中间文件描述符来处理编程接口到网络的操作。

1.2 Socket包括哪些内容
一个特殊的通信域,比如一个网络连接
一个特殊的通信类型,比如流或者数据报
一个特殊的协议,比如TCP或者UDP

1.3 Unix的Socket() C函数详细说明:
int socket(int domain, int type, int protocol)
domain的取值:
PF_UNIXUnix IPC通信
PF_INETIPV4通信
PF_INET6 IPV6
PF_IPXNovell IPX
PF_NETLINK Kernel用户接口驱动程序
PF_X25X.25
PF_AX25
PF_ATMPVC ATM PVC
PF_APPLETALK AppleTalk协议
PF_PACKET 低级包接口
type的取值:
SOCK_STREAM 使用面向连接的通信包
SOCK_DGRAM 使用无连接的通信包
SOCK_SEQPACKET 使用有固定最大长度的面向连接的通信包
SOCK_RAW 使用原IP包
SOCK_RDM 使用不保证次序的可靠数据报
Protocol:
一般使用与type对应的默认协议,用0表示。
例如: int newsocket = socket(PF_INET, SOCK_STREAM,0 );//使用TCP

1.4 使用面向连接的套接字
IP领域只有两种类型: connection-oriented, connectionless
使用面向连接的套接字,服务器和客户端需要如下通信方式:

Server Client

socket() socket()
bind()
listen()
accept() <---- connect()
recv() <---- send()
send() ----> recv()
close()<—> close()

1.5 使用无连接的套接字
SOCK_DGRAM使用UDP协议。通信方式如下:

UDP Server UDP Client

socket() socket()
bind()
recvform() <— sendto()
sendto() —> recvform()
close()close()

1.6 使用无阻塞的I/O方法

什么是阻塞
比如使用recv(),如果函数接受不到数据,就会阻塞程序的继续执行。

如何防止阻塞
使用fcntl()函数,把套接字设置为无阻塞模式。

int newsocket;
newsocket = socket(PF_INET, SOCK_STREAM, 0 );
fcntl( newsocket, F_SETEL, O_NONBLOCK );

以后使用recv()就不会阻塞了。

另一种方式是使用多路套接字select()

2 WinSock技术

总的说来,就是模仿Unix socket的实现。
2.1 WinSock下的函数和流程

ServerClient
WSAstartup() WSAStartup()
WSASocket() WASSocket()
bind()
listen()
WSAAccept() <-- WSAConnect()
WSARecv() <-- WSASend()
WSASend() --> WSARecv()
close() <-> close()
WSACleanup() WSACleanup()

与Unix socket的最主要区别就是在最上面加了WSAStartup()函数,最后加了WSACleanup()函数。中间都是一样的。

int WSAStartup(WORD wversion, LPWSADATA lpWSAData)
第一个参数是版本,要求2.2 还是1.1.
函数成功以后,lpWSAData指向一个结构体,包括win sock的一些信息。

WSACleanup()函数用来释放winsocket库,这个函数之后,再调用任何socket函数,都会出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值