socket函数
SOCKET()
我們使用系統(tǒng)調(diào)用socket()來獲得文件描述符:
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
第一個(gè)參數(shù)domain設(shè)置為“AF_INET”。
第二個(gè)參數(shù)是套接口的類型:SOCK_STREAM或
SOCK_DGRAM。第三個(gè)參數(shù)設(shè)置為0。
系統(tǒng)調(diào)用socket()只返回一個(gè)套接口描述符,如果出錯(cuò),則返回-1。
bind()
一旦你有了一個(gè)套接口以后,下一步就是把套接口綁定到本地計(jì)算機(jī)的某一個(gè)端口上。但如果你只想使用connect()則無(wú)此必要。
下面是系統(tǒng)調(diào)用bind()的使用方法:
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr*my_addr,int addrlen);
第一個(gè)參數(shù)sockfd是由socket()調(diào)用返回的套接口文件描述符。
第二個(gè)參數(shù)my_addr是指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針。數(shù)據(jù)結(jié)構(gòu)sockaddr中包括了關(guān)于你的地址、端口和IP地址的信息。
第三個(gè)參數(shù)addrlen可以設(shè)置成sizeof(structsockaddr)。
下面是一個(gè)例子:
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#defineMYPORT3490
main()
{
int sockfd;
struct sockaddr_inmy_addr;
sockfd=socket(AF_INET,SOCK_STREAM,0);/*do someerror checking!*/
my_addr.sin_family=AF_INET;/*hostbyteorder*/
my_addr.sin_port=htons(MYPORT);/*short,network byte order*/
my_addr.sin_addr.s_addr=inet_addr("132.241.5.10");
bzero(&(my_addr.sin_zero),8);/*zero the rest of the struct*/
/*don't forget your error checking for bind():*/
bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr));
...
如果出錯(cuò),bind()也返回-1。
如果你使用connect()系統(tǒng)調(diào)用,那么你不必知道你使用的端口號(hào)。當(dāng)你調(diào)用connect()時(shí),它檢查套接口是否已經(jīng)綁定,如果沒有,它將會(huì)分配一個(gè)空閑的端口。
Connect()
系統(tǒng)調(diào)用connect()的用法如下:
#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr* serv_addr,int addrlen);
第一個(gè)參數(shù)還是套接口文件描述符,它是由系統(tǒng)調(diào)用socket()返回的。
第二個(gè)參數(shù)是serv_addr是指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針,其中包括目的端口和IP地址。
第三個(gè)參數(shù)可以使用sizeof(structsockaddr)而獲得。
下面是一個(gè)例子:
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#defineDEST_IP"132.241.5.10"
#defineDEST_PORT23
main()
{
intsockfd;
structsockaddr_indest_addr;/*will hold the destination addr*/
sockfd=socket(AF_INET,SOCK_STREAM,0);/*do some error checking!*/
dest_addr.sin_family=AF_INET;/*hostbyteorder*/
dest_addr.sin_port=htons(DEST_PORT);/*short,network byte order*/
dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
bzero(&(dest_addr.sin_zero),8);/*zero the rest of the struct*/
/*don'tforgettoerrorchecktheconnect()!*/
connect(sockfd,(structsockaddr*)&dest_addr,sizeof(struct sockaddr));
...
同樣,如果出錯(cuò),connect()將會(huì)返回-1。
listen()
如果你希望不連接到遠(yuǎn)程的主機(jī),也就是說你希望等待一個(gè)進(jìn)入的連接請(qǐng)求,然后再處理它們。這樣,你通過首先調(diào)用listen(),然后再調(diào)用accept()來實(shí)現(xiàn)。
系統(tǒng)調(diào)用listen()的形式如下:
intl isten(int sockfd,int backlog);
第一個(gè)參數(shù)是系統(tǒng)調(diào)用socket()返回的套接口文件描述符。
第二個(gè)參數(shù)是進(jìn)入隊(duì)列中允許的連接的個(gè)數(shù)。進(jìn)入的連接請(qǐng)求在使用系統(tǒng)調(diào)用accept()應(yīng)答之前要在進(jìn)入隊(duì)列中等待。這個(gè)值是隊(duì)列中最多可以擁有的請(qǐng)求的個(gè)數(shù)。大多數(shù)系統(tǒng)的缺省設(shè)置為20。你可以設(shè)置為5或者10。當(dāng)出錯(cuò)時(shí),listen()將會(huì)返回-1值。
當(dāng)然,在使用系統(tǒng)調(diào)用listen()之前,我們需要調(diào)用bind()綁定到需要的端口,否則系統(tǒng)內(nèi)核將會(huì)讓我們監(jiān)聽一個(gè)隨機(jī)的端口。所以,如果你希望監(jiān)聽一個(gè)端口,下面是應(yīng)該使用的系統(tǒng)調(diào)用的順序:
socket();
bind();
listen();
/*accept()goeshere*/
accept()
系統(tǒng)調(diào)用accept()比較起來有點(diǎn)復(fù)雜。在遠(yuǎn)程的主機(jī)可能試圖使用connect()連接你使用
listen()正在監(jiān)聽的端口。但此連接將會(huì)在隊(duì)列中等待,直到使用accept()處理它。調(diào)用accept()
之后,將會(huì)返回一個(gè)全新的套接口文件描述符來處理這個(gè)單個(gè)的連接。這樣,對(duì)于同一個(gè)連接
來說,你就有了兩個(gè)文件描述符。原先的一個(gè)文件描述符正在監(jiān)聽你指定的端口,新的文件描
述符可以用來調(diào)用send()和recv()。
調(diào)用的例子如下:
#include<sys/socket.h>
intaccept(intsockfd,void*addr,int*addrlen);
第一個(gè)參數(shù)是正在監(jiān)聽端口的套接口文件描述符。第二個(gè)參數(shù)addr是指向本地的數(shù)據(jù)結(jié)構(gòu)
sockaddr_in的指針。調(diào)用connect()中的信息將存儲(chǔ)在這里。通過它你可以了解哪個(gè)主機(jī)在哪個(gè)
端口呼叫你。第三個(gè)參數(shù)同樣可以使用sizeof(structsockaddr_in)來獲得。
如果出錯(cuò),accept()也將返回-1。下面是一個(gè)簡(jiǎn)單的例子:
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#defineMYPORT3490/*theportuserswillbeconnectingto*/
#defineBACKLOG10/*howmanypendingconnectionsqueuewillhold*/
main()
{
intsockfd,new_fd;/*listenonsock_fd,newconnectiononnew_fd*/
structsockaddr_inmy_addr;/*myaddressinformation*/
structsockaddr_intheir_addr;/*connector'saddressinformation*/
intsin_size;
sockfd=socket(AF_INET,SOCK_STREAM,0);/*dosomeerrorchecking!*/
my_addr.sin_family=AF_INET;/*hostbyteorder*/
my_addr.sin_port=htons(MYPORT);/*short,networkbyteorder*/
my_addr.sin_addr.s_addr=INADDR_ANY;/*auto-fillwithmyIP*/
bzero(&(my_addr.sin_zero),8);/*zerotherestofthestruct*/
/*don'tforgetyourerrorcheckingforthesecalls:*/
bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr));
listen(sockfd,BACKLOG);
sin_size=sizeof(structsockaddr_in);
new_fd=accept(sockfd,&their_addr,&sin_size);
...
下面,我們將可以使用新創(chuàng)建的套接口文件描述符new_fd來調(diào)用send()和recv()。
send() 和recv()
系統(tǒng)調(diào)用send()的用法如下:
int send(int sockfd,const void* msg,int len,int flags);
第一個(gè)參數(shù)是你希望給發(fā)送數(shù)據(jù)的套接口文件描述符。它可以是你通過socket()系統(tǒng)調(diào)用返回的,也可以是通過accept()系統(tǒng)調(diào)用得到的。
第二個(gè)參數(shù)是指向你希望發(fā)送的數(shù)據(jù)的指針。
第三個(gè)參數(shù)是數(shù)據(jù)的字節(jié)長(zhǎng)度。第四個(gè)參數(shù)標(biāo)志設(shè)置為0。
下面是一個(gè)簡(jiǎn)單的例子:
char*msg="Beejwashere!";
intlen,bytes_sent;
..
len=strlen(msg);
bytes_sent=send(sockfd,msg,len,0);
...
系統(tǒng)調(diào)用send()返回實(shí)際發(fā)送的字節(jié)數(shù),這可能比你實(shí)際想要發(fā)送的字節(jié)數(shù)少。如果返回的字節(jié)數(shù)比要發(fā)送的字節(jié)數(shù)少,你在以后必須發(fā)送剩下的數(shù)據(jù)。當(dāng)send()出錯(cuò)時(shí),將返回-1。
系統(tǒng)調(diào)用recv()的使用方法和send()類似:
int recv(int sockfd,void* buf,int len,unsigned int flags);
第一個(gè)參數(shù)是要讀取的套接口文件描述符。
第二個(gè)參數(shù)是保存讀入信息的地址。
第三個(gè)參數(shù)是緩沖區(qū)的最大長(zhǎng)度。第四個(gè)參數(shù)設(shè)置為0。
系統(tǒng)調(diào)用recv()返回實(shí)際讀取到緩沖區(qū)的字節(jié)數(shù),如果出錯(cuò)則返回-1。
這樣使用上面的系統(tǒng)調(diào)用,你可以通過數(shù)據(jù)流套接口來發(fā)送和接受信息。
sendto() 和recvfrom()
因?yàn)閿?shù)據(jù)報(bào)套接口并不連接到遠(yuǎn)程的主機(jī)上,所以在發(fā)送數(shù)據(jù)包之前,我們必須首先給出目的地址,請(qǐng)看:
int sendto(int sockfd,const void* msg,int len,unsigned int flags,
conststruct sockaddr*to,inttolen);
除了兩個(gè)參數(shù)以外,其他的參數(shù)和系統(tǒng)調(diào)用send()時(shí)相同。
參數(shù)to是指向包含目的IP地址和端口號(hào)的數(shù)據(jù)結(jié)構(gòu)sockaddr的指針。
參數(shù)tolen可以設(shè)置為sizeof(structsockaddr)。
系統(tǒng)調(diào)用sendto()返回實(shí)際發(fā)送的字節(jié)數(shù),如果出錯(cuò)則返回-1。
系統(tǒng)調(diào)用recvfrom()的使用方法也和recv()的十分近似:
int recvfrom(int sockfd,void* buf,int len,unsigned int flags
struct sockaddr* from,int* fromlen);
參數(shù)from是指向本地計(jì)算機(jī)中包含源IP地址和端口號(hào)的數(shù)據(jù)結(jié)構(gòu)sockaddr的指針。
參數(shù)fromlen設(shè)置為sizeof(struct sockaddr)。
系統(tǒng)調(diào)用recvfrom()返回接收到的字節(jié)數(shù),如果出錯(cuò)則返回-1。
close() 和shutdown()
你可以使用close()調(diào)用關(guān)閉連接的套接口文件描述符:
close(sockfd);
這樣就不能再對(duì)此套接口做任何的讀寫操作了。
使用系統(tǒng)調(diào)用shutdown(),可有更多的控制權(quán)。它允許你在某一個(gè)方向切斷通信,或者切斷雙方的通信:
int shutdown(int sockfd,int how);
第一個(gè)參數(shù)是你希望切斷通信的套接口文件描述符。第二個(gè)參數(shù)how值如下:
0—Furtherreceivesaredisallowed
1—Furthersendsaredisallowed
2—Furthersendsandreceivesaredisallowed(likeclose())
shutdown()如果成功則返回0,如果失敗則返回-1。
?getpeername()
這個(gè)系統(tǒng)的調(diào)用十分簡(jiǎn)單。它將告訴你是誰(shuí)在連接的另一端:
#include<sys/socket.h>
int getpeername(int sockfd,struct sockaddr* addr,int* addrlen);
第一個(gè)參數(shù)是連接的數(shù)據(jù)流套接口文件描述符。
第二個(gè)參數(shù)是指向包含另一端的信息的數(shù)據(jù)結(jié)構(gòu)sockaddr的指針。
第三個(gè)參數(shù)可以設(shè)置為sizeof(structsockaddr)。
如果出錯(cuò),系統(tǒng)調(diào)用將返回-1。
一旦你獲得了它們的地址,你可以使用inet_ntoa()或者gethostbyaddr()來得到更多的信息。?gethostname()
系統(tǒng)調(diào)用gethostname()比系統(tǒng)調(diào)用getpeername()還簡(jiǎn)單。它返回程序正在運(yùn)行的計(jì)算機(jī)的名字。系統(tǒng)調(diào)用gethostbyname()可以使用這個(gè)名字來決定你的機(jī)器的IP地址。
下面是一個(gè)例子:
#include<unistd.h>
int gethostname(char*hostname,size_tsize);
如果成功,gethostname將返回0。如果失敗,它將返回-1。
-----------------------------------------------------------------------------------------------------------------------------------------------------------
基本TCP套接口編程一
本文出自:http://sunsland.top263.net 作者: (2001-10-22 12:00:00)
概述
socket() --得到文件描述符!
bind() --我們?cè)谀膫€(gè)端口?
connect() --Hello!
listen() --有人給我打電話嗎?
accept() --"Thank you for calling port 3490."
send() 和 recv() --Talk to me, baby!
sendto() 和 recvfrom() --Talk to me, DGRAM-style
close() 和 shutdown() --滾開!
getpeername() --你是誰(shuí)?
gethostname() --我是誰(shuí)?
DNS --你說“白宮”,我說 "198.137.240.100"
--------------------------------------------------------------------------------
socket函數(shù)
功能:指定協(xié)議類型
定義:
#include
#include
int socket(int family, int type, int protocol);
返回值
出錯(cuò): -1
成功: 套接口描述字 (socket file descriptor)(套接字)sockfd
socket 函數(shù)指定了協(xié)議族(IPv4、IPv6或unix)和套接口類型(字節(jié)流、數(shù)據(jù)報(bào)或原
始套接口)。但并沒有指定本地協(xié)議地址或遠(yuǎn)程協(xié)議地址。
理解socket
socket使用 Unix 文件描述符 (file descriptor) 和其他程序通訊的方式。
Unix 程序在執(zhí)行任何形式的 I/O 的時(shí)候,程序是在讀或者寫一個(gè)文件描述符。
一個(gè)文件描述符只是一個(gè)和打開的文件相關(guān)聯(lián)的整數(shù)。
這個(gè)文件可能是一個(gè)網(wǎng)絡(luò)連接,FIFO,管道,終端,磁盤上的文件或者什么其他
的東西。Unix 中所有的東西是文件!因此,與 Internet 上別的程序通訊的時(shí)候,
要通過文件描述符。利用系統(tǒng)調(diào)用 socket()得到網(wǎng)絡(luò)通訊的文件描述符。他返回
套接口描述符 (socket descriptor),然后再通過他來調(diào)用 send() 和 recv()。
那么為什么不用一般的調(diào)用 read() 和 write() 來通過套接口通訊?
簡(jiǎn)單的答案是:可以使用一般的函數(shù)!
詳細(xì)的答案是:使用 send() 和 recv() 讓你更好的控制數(shù)據(jù)傳輸。
--------------------------------------------------------------------------------
connect 函數(shù)
功能:建立與TCP服務(wù)器的連接
定義:
#include
#include
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
//sockfd 是系統(tǒng)調(diào)用 socket() 返回的套接口文件描述符
serv_addr 是保存著目的地端口和 IP 地址的數(shù)據(jù)結(jié)構(gòu) struct sockaddr
//addrlen 設(shè)置為 sizeof(struct sockaddr)
connect 激發(fā) TCP的三路握手過程
服務(wù)器必須準(zhǔn)備好接受外來的連接。
這通過調(diào)用socket,bind和1isten函數(shù)來完成,稱為被動(dòng)打開(Passive open)
客戶通過調(diào)用connect進(jìn)行主動(dòng)打開(active opn)。
這引起客戶TCP發(fā)送一個(gè)SYN分節(jié)(表示同步),它告訴服務(wù)器客戶將在(待建立的)
連接中發(fā)送的數(shù)據(jù)的初始序列號(hào)。
服務(wù)器必須確認(rèn)客戶的SYN,同時(shí)自己也得發(fā)送一個(gè)SYN分節(jié),它含有服務(wù)器將在
同一連接中發(fā)送的數(shù)據(jù)的韌始序列號(hào)。服務(wù)器以單個(gè)分節(jié)向客戶發(fā)送SYN和對(duì)客戶
SYN的ACK。客戶必須確認(rèn)服務(wù)器的SYN。
connect 出錯(cuò)時(shí)的返回
出錯(cuò)原因 :未收到SYN的響應(yīng)(服務(wù)器超時(shí),75s)
返回值:ETIMEDOUT
用戶端輸出:Connection time out.
出錯(cuò)原因 :收到RST響應(yīng)(Hard error)SYN到達(dá)服務(wù)器,但該服務(wù)器的無(wú)此項(xiàng)端口服務(wù)
返回值:ECONNREFUSE
用戶端輸出:Connection refused
出錯(cuò)原因 :ICMP錯(cuò)誤:不可路由(soft error)(目的地不可達(dá))
返回值:EHOSTUNREACH
用戶端輸出:ENETUNREACH No route to host
--------------------------------------------------------------------------------
bind 函數(shù)
功能:給套接口分配一個(gè)本地協(xié)議地址
定義:
#include
#include
int bind(int sockfd, const struct sockaddr *my_addr, int addrlen);
sockfd 是調(diào)用 socket 返回的文件描述符。
my_addr 是指向數(shù)據(jù)結(jié)構(gòu) struct sockaddr 的指針,保存地址(即端口和 IP 地址) 信息。
addrlen 設(shè)置為 sizeof(struct sockaddr)。
返回: 0—成功, -1---出錯(cuò)
讓內(nèi)核自動(dòng)處理地址ip和端口port
my_addr.sin_port = 0; /* choose an unused port at random */
my_addr.sin_addr.s_addr = INADDR_ANY; /* use my IP address */
bind( ) 自己選擇合適的端口:將0賦給 my_addr.sin_por。
自動(dòng)填上他所運(yùn)行的機(jī)器的 IP 地址:my_addr.sin_addr.s_addr 設(shè)置為 INADDR_ANY。
--------------------------------------------------------------------------------
listen 函數(shù)
功能:將未連接主動(dòng)套接口的轉(zhuǎn)換為被動(dòng)套接口,指示內(nèi)核接受對(duì)該套接口的連接請(qǐng)求.
CLOSED --? LISTEN
定義:
#include
int listen(int sockfd, int backlog);
sockfd 是調(diào)用 socket() 返回的套接口文件描述符。
backlog 是在進(jìn)入隊(duì)列中允許的連接數(shù)目。
監(jiān)聽套接口的兩個(gè)隊(duì)列
未完成連接隊(duì)列(incompleted connection queue): SYN_RECV
已完成連接隊(duì)列(completed connection queue): ESTABLISHED
當(dāng)一個(gè)客戶的SYN到達(dá)時(shí),如兩隊(duì)列都滿的, TCP將忽略該分節(jié)且不發(fā)RST
--------------------------------------------------------------------------------
ACCEPT 函數(shù)
功能:在已完成隊(duì)列頭返回下一個(gè)已完成的連接
定義
#include
int accept(int sockfd, struct sockaddr *cliaddr, int* addrlen);
調(diào)用成功時(shí)返回: 1. cliaddr: 客戶進(jìn)程的協(xié)議地址和地址大小 2. 新套接口描述字
(已連接套接口描述字)
監(jiān)聽套接口描述字 listening socket descriptor
一個(gè)給定的服務(wù)器常常是只生成一個(gè)監(jiān)聽套接口, 且一直存在,直到該服務(wù)器關(guān)閉。
已連接套接口描述字connected socket descriptor
內(nèi)核為每個(gè)被接受的客戶連接創(chuàng)建了一個(gè)已連接套接口。當(dāng)服務(wù)器完成某客戶的服務(wù)時(shí),
關(guān)閉已連接套接口。
1024以下的端口:超級(jí)用戶使用
--------------------------------------------------------------------------------
fork 函數(shù)
功能:派生新進(jìn)程 create new process
定義:
#include
pid_t fork (void);
在子進(jìn)程中返回0,在父進(jìn)程中返回子進(jìn)程的進(jìn)程ID
出錯(cuò)時(shí)返回 –1,調(diào)用一次返回兩次
fork的典型應(yīng)用:
1.一個(gè)進(jìn)程可為自己創(chuàng)建一個(gè)拷貝。當(dāng)一個(gè)拷貝處理一個(gè)操作時(shí),其他的拷貝可以
執(zhí)行其他的任務(wù)。這是非常典型的網(wǎng)絡(luò)服務(wù)器。
2.一個(gè)進(jìn)程想執(zhí)行其他的程序,由于創(chuàng)建新進(jìn)程的唯一方法是調(diào)用fork,進(jìn)程首先
調(diào) 用fork來生成一個(gè)拷貝,然后其中一個(gè)拷貝(通常為子進(jìn)程)調(diào)用exec 來代替自己
去執(zhí)行新程序。
(http://www.fanqiang.com)
-----------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
并發(fā)服務(wù)器
迭代服務(wù)器 iterative server 單進(jìn)程
并發(fā)服務(wù)器 concurrent server 多進(jìn)程
當(dāng)連接建立時(shí),accept返回,服務(wù)器調(diào)用fork
子進(jìn)程為客戶提供服務(wù)(通過connfd已連接套接口),
父進(jìn)程等待另一個(gè)連接(通過listenfd監(jiān)聽套接口)。
子進(jìn)程開始處理新客戶后,父進(jìn)程便關(guān)閉已連接套接口。
每個(gè)文件或套接口都有一個(gè)訪問計(jì)數(shù),該訪問計(jì)數(shù)在文件表項(xiàng)中維護(hù),它表示當(dāng)前指
向該文件或套接口的打開的描述字個(gè)數(shù)。
從sock返回后,與listenfd關(guān)聯(lián)的文件表項(xiàng)訪問計(jì)數(shù)值為1,
從accept返回后,與connfd關(guān)聯(lián)的文件表項(xiàng)訪問計(jì)數(shù)值也為1。
當(dāng)fork返回后,兩個(gè)描述字在父進(jìn)程與子進(jìn)程間共享(duplicated)與兩個(gè)套接門相關(guān)
聯(lián)的文件表項(xiàng)訪問計(jì)數(shù)值均為2。
當(dāng)父進(jìn)程關(guān)閉connfd時(shí),只是將訪問計(jì)數(shù)值從2減為1。描述字只在訪問計(jì)數(shù)值達(dá)到0時(shí)
才真正關(guān)閉,這在后面某個(gè)時(shí)候子進(jìn)程關(guān)閉connfd時(shí)會(huì)碰上.
--------------------------------------------------------------------------------
close 函數(shù)
功能:將套接口做上“已關(guān)閉的標(biāo)記”,并立即返回進(jìn)程。
將套接口描述字的訪問計(jì)數(shù)器減1。
當(dāng)訪問計(jì)數(shù)器值為0時(shí),引發(fā)TCP的四個(gè)分組連接終止序列,從而關(guān)閉套接口。
定義:
#include
int close(int sockfd);
--------------------------------------------------------------------------------
getsockname 和 getpeername函數(shù)
功能:
getsockname: 返回本地協(xié)議地址
getpeername:返回遠(yuǎn)程協(xié)議地址
定義:
#include
int getsockname (int sockfd, struct sockaddr *localaddr, int *addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, int *addrlen);
--------------------------------------------------------------------------------
一個(gè)示例程序:
#include
#include
#include
#define MYPORT 3490 /* the port users will be connecting to */
#define BACKLOG 10 /* how many pending connections queue will hold */
main()
{
int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */
struct sockaddr_in my_addr; /* my address information */
struct sockaddr_in their_addr; /* connector's address information */
int sin_size;
sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */
my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(MYPORT); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
/* don't forget your error checking for these calls: */
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
listen(sockfd, BACKLOG);
sin_size = sizeof(struct sockaddr_in);
new_fd = accept(sockfd, &their_addr, &sin_size);
總結(jié)
- 上一篇: Diango REST framewor
- 下一篇: SICP学习笔记(P27-P28)