進程間通信的方式:
1、管道(包括無名管道和命名管道);
2、消息隊列;
3、信號量;
4、共享存儲。
5、……( Socket和Streams支持不同主機上的兩個進程IPC)。
int socket(int domain,int type,int protocol) ;
udp bind?domain :地址域 指定網絡層到底使用什么協議
AF_INET : ipv4版本的ip協議
AF_INET6 : ipv6版本的ip協議
type :套接字類型
SOCK_DGRAM :用戶數據報套接字
SOCK_STREAM :流式套接字
protocol:協議
SOCK_DGRAM :
1.指定為0,表示采用默認協議,SOCK_DGRAM默認協議就是UDP協議
2.IPPROTO_UDP ( 17)scoK_STREAM:
1.指定為0,表示采用默認協議,
SOCK_STREAM:
1.指定為0,表示采用默認協議,默認協議是TCP協議
2.IPPROTO_TCP (6)
返回值: 返回一個套接字操作句柄,本質上是一個文件描述符,返回值大于等于o 則為創建成功,返回值小于0,則為創建失敗
int bind(int sockfd,const struct sockaddr *addr , socklen_t addr1en);
struct sockaddr{
sa_family_t sa_family;//地址域,(AF_INET,AF_INT6)2字節char
sa_data[14];//14字節
}
sslsocket套接字。
在網絡編程中我們會對sockaddr_in結構體進行操作,使用sockaddr_in來建立所需的信息,最后使用類型轉化就可以了。一般先把sockaddr_in變量賦值后,強制類型轉換后傳入用sockaddr做參數的函數:sockaddr_in用于socket定義和賦值;sockaddr用于函數參數。
#inclue<stdio.h>
#include<unistd.h>
//網絡編程
#include<sys/socket.h>
#include<netinet/in.h>//互聯網地址簇
#include<arpa/inet.h> //信息轉化int main() {//1.創建套接字int sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(sockfd<0) {perror("socket false");return -1;}//2.綁定地址struct sockaddr_in addr;addr.sin_family=AF_INET;//將ip地址轉化為無符號32位//將unit32轉化為主機字節序轉化為網絡字節序//htonl只能完成第二件事情//將字符串轉化為網絡字節序addr.sin_addr.s_addr=inet_addr("192.168.21.128");//端口轉換為網絡字節序addr.sin_port=htons(19999);//綁定地址信息int ret=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));if(ret<0) {perror("bind false");return -1;}while(1) {sleep(1);}return 0;
}
運行結果:sockfd的文件描述符為3,且為一個軟連接,閃爍表示源文件不存在,我們之前在管道中也遇見過,因為是直接進入內核內部的緩沖區進操作的,緩沖區并沒有文件:
netstat -anp| grep 【端口號】
查看綁定端口的相應信息:
注意:
1.一個進程可以綁定多個端口,但一個端口只能綁定一個進程
2.如果客戶端想綁定端口號,一定要調用發送信息函數之前綁定( bind )端口,因為在發送信息函數( sendto, 或 write ),系統會自動給當前網絡程序分配一個隨機端口號,這相當于隨機綁定了一個端口號,這里只會分配一次,以后通信就以這個隨機端口通信,我們再綁定端口號的話,就會綁定失敗。如果我們放在發送信息函數( sendto, 或 write )之前綁定,那樣程序將以我們綁定的端口號發送信息,不會再隨機分配一個端口號。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态