C语言网络编程:socket函数
函數(shù)描述
-
頭文件
<sys/types.h> <sys/socket.h> -
函數(shù)使用
int socket(int domain, int type, int protocol); -
函數(shù)功能:創(chuàng)建一個通信的終點,并返回一個文件描述符來代表通信的終點
-
函數(shù)參數(shù):
a.domain代編當(dāng)前創(chuàng)建的socket文件描述符使用的是哪一個協(xié)議族進(jìn)行通信,這些協(xié)議族都包含在sys/socket.h,其中主要的協(xié)議族如下:AF_UNIX, AF_LOCAL本地進(jìn)程通信AF_INETIPV4網(wǎng)絡(luò)傳輸層協(xié)議AF_INET6IPV6網(wǎng)絡(luò)傳輸層協(xié)議AF_IPIPX-Novell協(xié)議AF_NETLINK內(nèi)核用戶接口設(shè)備
當(dāng)前正式得協(xié)議族描述已經(jīng)變?yōu)?code>PF_INET。。。
TCP/IP協(xié)議族如下
b.
type函數(shù)socket()的參數(shù)type用于設(shè)置套接字通信的類型,指定使用TCP/IP協(xié)議族中的哪個子協(xié)議進(jìn)行通信,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(數(shù)據(jù)包套接字)SOCK_STREAM提供有序的、可靠的、雙鏈接的、字節(jié)流數(shù)據(jù)傳輸;主要是用作TCP鏈接時的數(shù)據(jù)傳輸,此時如果想要使用TCP協(xié)議,則將domain設(shè)置為AF_INET即可SOCK_DGRAM支持無鏈接、不可靠的數(shù)據(jù)傳輸,數(shù)據(jù)傳輸時定長;主要時用作UDP鏈接時的傳輸SOCK_SEQPACKET提供有序的,可靠的,雙鏈接的數(shù)據(jù)傳輸通道,數(shù)據(jù)長度定長,使用的時候需要將數(shù)據(jù)全部讀出SOCK_RAWRAW類型,提供原始網(wǎng)絡(luò)協(xié)議訪問;即此時我們使用的通信協(xié)議為IP 協(xié)議SOCK_RDM提供可靠的數(shù)據(jù)報文,不過可能數(shù)據(jù)會有亂序SOCK_PACKET當(dāng)前通信類型已經(jīng)過時,不應(yīng)在通信程序中使用SOCK_NOBLOCK將socket返回的文件描述符指定為非阻塞的,類似SOCK_STREAM | SOCK_NOBLOCK表示使用面向鏈接的數(shù)據(jù)傳輸同時非阻塞SOCK_CLOEXEC表示一旦進(jìn)程執(zhí)行exec系統(tǒng)調(diào)用之后,將會自動關(guān)閉socket返回的套接字文件描述符
c.
protocol特例化來一個協(xié)議,用來指定協(xié)議號
一般情況下protocol寫0,表示使用domain和type指定的協(xié)議,不過如果domain和type所指定的協(xié)議有好幾個時,此時就需要通過具體的協(xié)議號來區(qū)分,否則寫0即可。
所有的協(xié)議編號都被保存在了/etc/procotols下,tcp協(xié)議編號為6,udp協(xié)議編號為17ip 0 IP # internet protocol, pseudo protocol number hopopt 0 HOPOPT # IPv6 Hop-by-Hop Option [RFC1883] icmp 1 ICMP # internet control message protocol igmp 2 IGMP # Internet Group Management ggp 3 GGP # gateway-gateway protocol ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'') ...類似如下
socket (AF_INET, SOCK_STREAM,6);和socket (AF_INET, SOCK_STREAM,0);都代表tcp協(xié)議
代碼舉例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>void print_err(char *str, int line, int err_no) {printf("%d, %s :%s\n",line,str,strerror(err_no));_exit(-1);
}int main()
{int skfd = -1;/*創(chuàng)建使用TCP通信的套接字文件描述符*/skfd = socket(AF_INET, SOCK_STREAM, 0);if ( -1 == skfd) {print_err("socket failed",__LINE__,errno);}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的C语言网络编程:socket函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言网络编程:bind函数详解
- 下一篇: C语言网络编程:TCP编程模型