BSD Socket

出处:csdn火木达人

伯克利套接字(Berkeley sockets),也称为BSD Socket。伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信。 BSD Socket的应用编程接口已经是网络套接字的事实上的抽象标准。大多数其他程序语言使用一种相似的编程接口。

BSD Socket作为一种API,允许不同主机或者同一个计算机上的不同进程之间的通信。它支持多种I/O设备和驱动,但是具体的实现是依赖操作系统的。这种接口对于TCP/IP是必不可少的,所以是互联网的基础技术之一。它最初是由加州伯克利大学为Unix系统开发出来的。所有现代的操作系统都都实现了伯克利套接字接口,因为它已经是连接互联网的标准接口了。

TCP协议

服务器端编程的步骤:
1. 加载套接字库,创建套接字socket();
2. 绑定套接字到一个IP地址和一个端口上bind();
3. 将套接字设置为监听模式等待连接请求listen();
4. 请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字accept();
5. 用返回的套接字和客户端进行通信send()/recv();
6. 关闭套接字,关闭加载的套接字库close()。

  1. #include <iostream>  
  2. #include<sys/types.h>  
  3. #include<cstdlib>  
  4. #include<string.h>  
  5. #include<string>  
  6. #include<unistd.h>  
  7. #include<netinet/in.h>  
  8. #include<sys/socket.h>  
  9. #include<netdb.h>  
  10. #include<arpa/inet.h>  
  11.   
  12. using namespace std;  
  13.   
  14. int PROXY_PORT = 5000;  
  15. #define MAXBUF 1024  
  16.   
  17. int main(int argc, const char * argv[])  
  18. {  
  19.     int sockfd;  
  20.     int newsockfd;  
  21.       
  22.     struct sockaddr_in server_address;  
  23.     struct sockaddr_in client_address;  
  24.       
  25.     socklen_t clilen = sizeof( client_address);  
  26.     //1.创建套接字  
  27.     sockfd = socket( AF_INET , SOCK_STREAM , 0 );  
  28.     if(sockfd < 0){  
  29.         perror("can't establish socket");  
  30.         exit(1);  
  31.     }  
  32.       
  33.     //填充ip地址和端口  
  34.     bzero( &(server_address) ,sizeof(server_address ));  
  35.     server_address.sin_family = AF_INET;  
  36.     server_address.sin_port = htons(PROXY_PORT);  
  37.     server_address.sin_addr.s_addr = INADDR_ANY;  
  38.       
  39.     //2.绑定套接字到一个IP地址和一个端口上  
  40.     if(::bind( sockfd , (struct sockaddr *)&server_address , sizeof(struct sockaddr)) < 0)  
  41.     {  
  42.         perror("can't bind");  
  43.         exit(1);  
  44.     }  
  45.     //3. 将套接字设置为监听模式等待连接请求  
  46.     if(listen(sockfd ,5) < 0)  
  47.     {  
  48.         perror("cannot listen");  
  49.         exit(1);  
  50.     }  
  51.     //4.请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字  
  52.     newsockfd = accept( sockfd , (sockaddr *)&client_address , &clilen);  
  53.     printf("accept client %s\n; newsockfd: %d",inet_ntoa(server_address.sin_addr),newsockfd);  
  54.     //5. 用返回的套接字和客户端进行通信  
  55.     char sendMsg[256] = {0};  
  56.     sprintf(sendMsg, "%s","Welcome to my server\n");  
  57.     int len = (int)send(newsockfd,sendMsg,strlen(sendMsg),0);//发送数据  
  58.     char buffer[MAXBUF];  
  59.     bzero(buffer , MAXBUF);  
  60.     while((len = (int)recv(newsockfd, buffer, MAXBUF,0)) > 0)//接受数据  
  61.     {  
  62.         printf("%s\n",buffer);  
  63.         bzero(buffer, MAXBUF);  
  64.         sprintf(buffer, "%s","server data");  
  65.         if(send(newsockfd,buffer,len,0)<0)  
  66.         {  
  67.             perror("write");  
  68.             return 1;  
  69.         }  
  70.         bzero(buffer, MAXBUF);  
  71.     }  
  72.     //6.关闭套接字库  
  73.     close(newsockfd);  
  74.     close(sockfd);  
  75.     return 0;  
  76. }  

客户端编程的步骤:
1. 加载套接字库,创建套接字socket();
2. 向服务器发出连接请求connect();
3. 和服务器端进行通信send()/recv();
4. 关闭套接字,关闭加载的套接字库close()。
  1. #include <iostream>  
  2. #include<sys/types.h>  
  3. #include<cstdlib>  
  4. #include<string.h>  
  5. #include<string>  
  6. #include<unistd.h>  
  7. #include<netinet/in.h>  
  8. #include<sys/socket.h>  
  9. #include<netdb.h>  
  10. #include<arpa/inet.h>  
  11.   
  12. #define PROXY "127.0.0.1" //your ip address  
  13. int PROXY_PORT = 5000;  
  14. #define MAXBUF 1024  
  15.   
  16. int main(int argc, const char * argv[])  
  17. {  
  18.   
  19.     int sockfd;  
  20.     struct sockaddr_in  serv_addr;  
  21.     struct hostent* server;  
  22.       
  23.     //套接字结构,包括远程的ip  
  24.     server = gethostbyname(PROXY);  
  25.     int iplen = 16;  
  26.     char* ip = (char*) malloc(iplen);  
  27.     inet_ntop( AF_INET , (void*) server->h_addr_list[0], ip ,iplen);  
  28.       
  29.     bzero( (sockaddr_in *)&serv_addr , sizeof(sockaddr_in));  
  30.     serv_addr.sin_family = AF_INET;  
  31.       
  32.     int ret;  
  33.     //1. 加载套接字库,创建套接字  
  34.     sockfd = socket ( AF_INET,SOCK_STREAM,0);  
  35.       
  36.     bcopy( (char*)server->h_addr, (char*)& serv_addr.sin_addr.s_addr,server->h_length );  
  37.     serv_addr.sin_port = htons(PROXY_PORT);  
  38.       
  39.     //2. 向服务器发出连接请求  
  40.     if((ret = connect(sockfd,(struct sockaddr*)& serv_addr, sizeof(serv_addr))) < 0){  
  41.         printf("Cannot connect to server");  
  42.         exit(0);  
  43.     }  
  44.     //3. 和服务器端进行通信  
  45.     char buffer[MAXBUF];  
  46.     int n;  
  47.     bzero(buffer, MAXBUF);  
  48.     printf("connected to server\n");  
  49.     int len= (int)recv(sockfd,buffer,BUFSIZ,0);//接收服务器端信息  
  50.     printf("server msg : %s \n",buffer); //打印服务器端信息  
  51.       
  52.     while (1) {  
  53.         printf("input msg:\n");  
  54.         bzero(buffer , 1023);  
  55.         scanf("%[^\n]",buffer);  
  56.         getchar();  
  57.         int len = (int)strlen(buffer);  
  58.         if( len > 0){  
  59.             buffer[len] = '\n';  
  60.             buffer[len+1] = '\0';  
  61.             //            n = write(sockfd , buffer , strlen(buffer));  
  62.             n = (int)send(sockfd, buffer, strlen(buffer), 0);  
  63.             if(n<0)break;  
  64.         }  
  65.     }  
  66.     //4. 关闭套接字  
  67.     close(sockfd);  
  68.     return 0;  
  69. }  

默认创建的是阻塞模式

UDP协议

服务器端不需要listen和accept

客户端不需要connect

服务器端和客户端收发数据使用recvfrom和sendto

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值