网络编程函数1

网络编程使用的函数

头文件:
C语言:

#include<sys/types.h>
#include<sys/socket.h>

c++

#include <Winsock2.h>
#pragma comment( lib, "ws2_32.lib" )

socket()函数

socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。
函数原型如下:

int socket(int domain, int type, int protocol);

建立一个协议族domain,协议类型type,协议编号为protocol的文件描述符。

domain

用于设置网络通讯的域,函数socket()根据这个参数选择通讯协议族,协议在头文件sys/socket.h中定义。

名称含义名称含义
PF_UNIX,PF_LOCAL本地通信AF_INET,PF_INETIPv4 Internet协议
PF_INET6IPv6 Internet协议PF_IPXIPX-Novell协议
PF_NETLINK内核用户界面设备PF_X25ITU-T X25 / ISO-8208协议
PF_AX25Amateur radio AX.25PF_ATMPVC原始ATM PVC访问
PF_APPLETALKAppletalkPF_PACKET底层包访问
type

用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK_DGRAM(数据包套接字)。

名称含义
SOCK_STREAMTcp连接,提供序列化的、可靠的、双向连接的字节流。支持带外数据传输
SOCK_DGRAM支持UDP连接(无连接状态的消息)
protocol

用于制定某个协议的特定类型,即type类型中的某个类型。通常某协议中只有一种特定类型,这样protocol参数仅能设置为0; 但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型。

类型为SOCK_STREAM的套接字表示一个双向的字节流,与管道类似。流式的套接字在进行数据收发之前必须已经连接,连接使用connect()函数进行。一旦连接,可以使用read()或者write()函数进行数据的传输。流式通信方式保证数据不会丢失或者重复接收。

return

成功返回系统描述符,失败返回-1,全局变量errno中保存返回的错误值。

bind()函数

bind函数把一个本地协议地址赋予一个套接字。
函数原型如下:

#include<sys/socket.h>

int bind(int sockfd,  const struct sockaddr, socklen_t addrlen);
参数:

第二个参数是一个指向特定协议的地址结构的指针,保存地址信息,第三个参数是该地址结构的长度。
对于TCP,调用bind函数可以指定一个端口号,或指定一个IP地址,也可以两者都指定,还可以都不指定。
例如:

void  main()

{

   int sockfd;

   struct sockaddr_in my_addr;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

   my_addr.sin_family = AF_INET;  

   my_addr.sin_port = htons(8090);  

   my_addr.sin_addr.s_addr = inet_addr("47.108.133.125"); 

   bzero(&(my_addr.sin_zero),8);   

   bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

}

在 bind() 函数中最后要说的话是,在处理自己的 IP 地址和/或端口的时候,有些工作是可以自动处理的,可以这样写:

my_addr.sin_port = 0;  

my_addr.sin_addr.s_addr = INADDR_ANY;  

通过将0赋给 my_addr.sin_port,你告诉 bind() 自己选择合适的端 口。同样,将my_addr.sin_addr.s_addr 设置为 INADDR_ANY,你告诉它自动填上它所运行的机器de 的 IP 地址。

return

在错误时返回-1,并设置全局错误变量errno。
ps:在端口设置中,不可选择小于1024的端口,所有小于1024的端口都被系统保留。可以选择从1024到65535中未被使用的端口。
你要注意的另外一件小事是: 有时候你根本不需要调用它。如果你使用connect()来和远程机器进行通讯,你不需要关心你的本地端口号(就象你在使用telnet 的时候),你只要简单的调用 connect() 就可以了,它会检查套接字是否绑定端口,如果没有,它会自己绑定一个没有使用的本地端口。

connect()函数

connect():建立到指定套接字的连接。
函数原型:

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 
参数:

sockfd 是系统调用socket() 返回的套接字文件描述符。serv_addr 是保存着目的地端口和 IP 地址的数据结构 struct sockaddr。addrlen 设置 为sizeof(struct sockaddr)。

示例:
main() 

{ 

  int sockfd; 

  struct sockaddr_in dest_addr;  

  sockfd = socket(AF_INET, SOCK_STREAM, 0);  

  dest_addr.sin_family = AF_INET;  

  dest_addr.sin_port = htons(23);  

  dest_addr.sin_addr.s_addr = inet_addr("47.108.133.125"); 

  bzero(&(dest_addr.sin_zero),8);  

    connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));

} 

这里没有调用 bind()。因为我不在乎本地的端口号。 我只关心我要去那。内核将为我选择一个合适的端口号,而我们所连接的地方也自动地获得这些信息。一切都不用担心。

return

错误返回-1,并设置全局错误变量errno。

listen()函数

监听连接

int listen(int sockfd, int backlog); 
参数:

sockfd 是调用socket() 返回的套接字文件描述符。backlog 是在进入队列中允许的连接数目,系统最大连接数为20。
错误返回-1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值