一、UNIX下socket通信:
socket套接字是一种可以进行网络通信的内核对象,它是一个唯一的标示符,一般称它为socket描述符。
注意:UDP通信需要客户端先发送消息,服务端先进行等待客户端发送的消息,记录下客户端的地址,才能向客户端发送消息。= =!
int socket(int domain,int type,int protocol) 功能:创建socket对象 1、domain通信地址类型: a、AF_UNIX/AF_LOCAL:本地进程通信 b、AF_INET:使用ipv4地址通信 c、AF_INET6:使用ipv6通信
d、AF_UOSPEC:未指定 2、type通信的协议类型(4种,以下列举出最常用的两种): SOCK_STREAM:数据流协议,TCP面向连接的通信协议 SOCK_DGRAM:数据报协议,UDP面向无连接的通信协议 3、protocol:特殊协议,一般不用,一般为0;
返回值:若成功,返回文件(套接字)描述符; 若出错,返回-1
//socket udp 服务端 #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> int main() { //创建socket对象 int sockfd=socket(AF_INET,SOCK_DGRAM,0); //创建网络通信对象 struct sockaddr_in addr; addr.sin_family =AF_INET; addr.sin_port =htons(1324); addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //绑定socket对象与通信链接 int ret =bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)); if(0>ret) { printf("bind "); return -1; } struct sockaddr_in cli; socklen_t len=sizeof(cli); while(1) { char buf =0; recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,&len); printf("recv num =%hhd ",buf); buf =66; sendto(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,len); } close(sockfd); }
//socket udp 客户端 #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<arpa/inet.h> int main() { //创建socket对象 int sockfd=socket(AF_INET,SOCK_DGRAM,0); //创建网络通信对象 struct sockaddr_in addr; addr.sin_family =AF_INET; addr.sin_port =htons(1324); addr.sin_addr.s_addr = inet_addr("192.168.0.143"); while(1) { printf("请输入一个数字:"); char buf=0; scanf("%hhd",&buf); sendto(sockfd,&buf, sizeof(buf),0,(struct sockaddr*)&addr,sizeof(addr)); socklen_t len=sizeof(addr); recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&addr,&len); if(66 ==buf) { printf(" server 成功接受 "); } else { printf("server 数据丢失 "); } } close(sockfd); }