创建BSD Socket的基本步骤

来源:互联网 发布:胡须生长液 知乎 编辑:程序博客网 时间:2024/05/16 03:45

转载请注明出处: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()。

#include <iostream>#include<sys/types.h>#include<cstdlib>#include<string.h>#include<string>#include<unistd.h>#include<netinet/in.h>#include<sys/socket.h>#include<netdb.h>#include<arpa/inet.h>using namespace std;int PROXY_PORT = 5000;#define MAXBUF 1024int main(int argc, const char * argv[]){int sockfd;int newsockfd;    struct sockaddr_in server_address;struct sockaddr_in client_address;    socklen_t clilen = sizeof( client_address);//1.创建套接字sockfd = socket( AF_INET , SOCK_STREAM , 0 );if(sockfd < 0){        perror("can't establish socket");        exit(1);}    //填充ip地址和端口bzero( &(server_address) ,sizeof(server_address ));server_address.sin_family = AF_INET;server_address.sin_port = htons(PROXY_PORT);server_address.sin_addr.s_addr = INADDR_ANY;    //2.绑定套接字到一个IP地址和一个端口上if(::bind( sockfd , (struct sockaddr *)&server_address , sizeof(struct sockaddr)) < 0)    {        perror("can't bind");        exit(1);    }//3. 将套接字设置为监听模式等待连接请求if(listen(sockfd ,5) < 0)    {        perror("cannot listen");        exit(1);    }    //4.请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字    newsockfd = accept( sockfd , (sockaddr *)&client_address , &clilen);    printf("accept client %s\n; newsockfd: %d",inet_ntoa(server_address.sin_addr),newsockfd);    //5. 用返回的套接字和客户端进行通信    char sendMsg[256] = {0};    sprintf(sendMsg, "%s","Welcome to my server\n");    int len = (int)send(newsockfd,sendMsg,strlen(sendMsg),0);//发送数据    char buffer[MAXBUF];    bzero(buffer , MAXBUF);    while((len = (int)recv(newsockfd, buffer, MAXBUF,0)) > 0)//接受数据    {        printf("%s\n",buffer);        bzero(buffer, MAXBUF);        sprintf(buffer, "%s","server data");        if(send(newsockfd,buffer,len,0)<0)        {            perror("write");            return 1;        }        bzero(buffer, MAXBUF);    }    //6.关闭套接字库    close(newsockfd);close(sockfd);    return 0;}

客户端编程的步骤:
1. 加载套接字库,创建套接字socket();
2. 向服务器发出连接请求connect();
3. 和服务器端进行通信send()/recv();
4. 关闭套接字,关闭加载的套接字库close()。

#include <iostream>#include<sys/types.h>#include<cstdlib>#include<string.h>#include<string>#include<unistd.h>#include<netinet/in.h>#include<sys/socket.h>#include<netdb.h>#include<arpa/inet.h>#define PROXY "127.0.0.1" //your ip addressint PROXY_PORT = 5000;#define MAXBUF 1024int main(int argc, const char * argv[]){    int sockfd;struct sockaddr_in  serv_addr;struct hostent* server;        //套接字结构,包括远程的ipserver = gethostbyname(PROXY);int iplen = 16;char* ip = (char*) malloc(iplen);inet_ntop( AF_INET , (void*) server->h_addr_list[0], ip ,iplen);    bzero( (sockaddr_in *)&serv_addr , sizeof(sockaddr_in));serv_addr.sin_family = AF_INET;    int ret;//1. 加载套接字库,创建套接字sockfd = socket ( AF_INET,SOCK_STREAM,0);    bcopy( (char*)server->h_addr, (char*)& serv_addr.sin_addr.s_addr,server->h_length );serv_addr.sin_port = htons(PROXY_PORT);        //2. 向服务器发出连接请求if((ret = connect(sockfd,(struct sockaddr*)& serv_addr, sizeof(serv_addr))) < 0){        printf("Cannot connect to server");        exit(0);    }    //3. 和服务器端进行通信    char buffer[MAXBUF];    int n;    bzero(buffer, MAXBUF);    printf("connected to server\n");    int len= (int)recv(sockfd,buffer,BUFSIZ,0);//接收服务器端信息    printf("server msg : %s \n",buffer); //打印服务器端信息        while (1) {        printf("input msg:\n");        bzero(buffer , 1023);        scanf("%[^\n]",buffer);        getchar();        int len = (int)strlen(buffer);        if( len > 0){            buffer[len] = '\n';            buffer[len+1] = '\0';            //            n = write(sockfd , buffer , strlen(buffer));            n = (int)send(sockfd, buffer, strlen(buffer), 0);            if(n<0)break;        }    }    //4. 关闭套接字    close(sockfd);    return 0;}

默认创建的是阻塞模式

UDP协议

服务器端不需要listen和accept

客户端不需要connect

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁半宝宝认字怎么办 上课注意力不集中老是发呆怎么办 海绵宝宝吃了会怎么办 宝宝误吞李子核怎么办 24个月宝宝不愿意说话怎么办 孩子凉着肚子吐怎么办 教宝宝说话不会说怎么办 2岁宝宝语言退化怎么办 两周宝宝嗓子哑怎么办 幼儿园孩子上课爱说话老师怎么办 一岁宝宝不会爬怎么办 孩子说话不太清楚怎么办 十一个月宝宝不爱吃饭怎么办 14个月宝宝不爱吃饭怎么办 一岁宝宝喜欢哭怎么办 4岁儿童不会说话怎么办 8个月宝宝37.5度怎么办 8个月婴儿37.5度怎么办 5个月宝宝38度怎么办 5个月宝宝发烧怎么办 五个月小孩38度怎么办 宝宝3岁还不会说话 怎么办 两岁宝宝流口水厉害怎么办 两周宝宝不说话怎么办 两岁宝宝说话有点口吃怎么办 一周岁的宝宝脾气不好怎么办 九个月的宝宝脾气不好怎么办 两岁宝宝脾气不好怎么办 2岁宝宝脾气不好怎么办 3岁宝宝脾气不好怎么办 脾气不好吓到宝宝了怎么办 四个月宝宝脾气不好怎么办 5岁说话不清楚该怎么办 小孩快上幼儿园了不怎么说话怎么办 四岁宝宝吐字不清楚怎么办 孕28周胎儿腿短怎么办 b超显示腿短怎么办 2岁多宝宝不愿意说话怎么办 6岁儿童咬字不清怎么办 两岁宝宝爱看电视怎么办 两岁宝宝喜欢看电视怎么办