socket给提供给使用进程TCP/UDP等网络协议进行网络通讯手段。
linux中网络编程通过socket接口实现;
socket既是一种特殊的IO,提供对应的文件描述符。socket都有一个相关的描述{协议,本地地址,本地端口,远程地址,远程端口}(五元组信息);每一个socket有一个本地的唯一socket,由操作系统分配。

#include <sys/socket.h>int socket(int domain, int type, int protocol)
返回:成功返回描述符,出错返回-1
socket说到底就是一个结构体

socket创建在内核中,若创建成功返回文件描述表中的socket描述符;
使用socket内核调用,创建结构体;

socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。

正如可以给fopen的传入不同参数值,以打开不同的文件。创建socket的时候,也可以指定不同的参数创建不同的socket描述符,socket函数的三个参数分别为:

domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等
protocol:就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。protocol一般取为0,表示给定的域和套接字类型类型选择默认协议;

注意:并不是上面的type和protocol可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默认协议。

Socket编程实例

服务器端:一直监听本机的8000号端口,如果收到连接请求,将接收请求并接收客户端发来的消息,并向客户端返回消息

/* File Name: server.c */  #include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<errno.h>  #include<sys/types.h>  #include<sys/socket.h>  #include<netinet/in.h>  #define DEFAULT_PORT 8000  #define MAXLINE 4096  int main(int argc, char** argv)  {  int    socket_fd, connect_fd;  struct sockaddr_in     servaddr;  char    buff[4096];  int     n;  //初始化Socket  if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);  exit(0);  }  //初始化  memset(&servaddr, 0, sizeof(servaddr));  servaddr.sin_family = AF_INET;  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。  servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT  //将本地地址绑定到所创建的套接字上  if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){  printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);  exit(0);  }  //开始监听是否有客户端连接  if( listen(socket_fd, 10) == -1){  printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);  exit(0);  }  printf("======waiting for client's request======\n");  while(1){  //阻塞直到有客户端连接,不然多浪费CPU资源。  if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){  printf("accept socket error: %s(errno: %d)",strerror(errno),errno);  continue;  }  //接受客户端传过来的数据  n = recv(connect_fd, buff, MAXLINE, 0);  //向客户端发送回应数据  if(!fork()){ /*紫禁城*/  if(send(connect_fd, "Hello,you are connected!\n", 26,0) == -1)  perror("send error");  close(connect_fd);  exit(0);  }  buff[n] = '\0';  printf("recv msg from client: %s\n", buff);  close(connect_fd);  }  close(socket_fd);  }

客户端:

/* File Name: client.c */  #include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<errno.h>  #include<sys/types.h>  #include<sys/socket.h>  #include<netinet/in.h>  #define MAXLINE 4096  int main(int argc, char** argv)  {  int    sockfd, n,rec_len;  char    recvline[4096], sendline[4096];  char    buf[MAXLINE];  struct sockaddr_in    servaddr;  if( argc != 2){  printf("usage: ./client <ipaddress>\n");  exit(0);  }  if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){  printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);  exit(0);  }  memset(&servaddr, 0, sizeof(servaddr));  servaddr.sin_family = AF_INET;  servaddr.sin_port = htons(8000);  if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){  printf("inet_pton error for %s\n",argv[1]);  exit(0);  }  if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){  printf("connect error: %s(errno: %d)\n",strerror(errno),errno);  exit(0);  }  printf("send msg to server: \n");  fgets(sendline, 4096, stdin);  if( send(sockfd, sendline, strlen(sendline), 0) < 0)  {  printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  exit(0);  }  if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1) {  perror("recv error");  exit(1);  }  buf[rec_len]  = '\0';  printf("Received : %s ",buf);  close(sockfd);  exit(0);  }

代码原文地址

socket(套接字)详解一种通讯机制相关推荐

  1. Linux下套接字详解(二)----套接字Socket

    在前面我们讲了TCP/IP.TCP和UDP的一些基本知识,但是协议只有一套,而我们系统多个TCP连接或多个应用程序进程必须通过同一个 TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算 ...

  2. 套接字详解(socket)

    用户认为的信息之间传输只是建立以两个应用程序上,实际上在TCP连接中是靠套接字来作为他们连接的桥梁. 那么什么是套接字呢? TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做 ...

  3. python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)

    文章目录 socket的定义 套接字的工作流程 socket函数使用 socket函数用法 服务端套接字函数 客户端套接字函数 公共用途的套接字函数 面向文件的套接字方法 打电话的流程演示 服务端.p ...

  4. Linux下套接字详解(四)----简单的TCP套接字应用(迭代型)

    前面我们已经将了TCP/UDP的基本知识,还说了并发服务器与迭代服务器的区别,我们大致了解大多数TCP服务器是并发的,大多数UDP服务器是迭代的 ,即我们在进行数据传送的时候,往往使用服务器与客户但之 ...

  5. Linux下套接字详解(七)----线程池accept处理高并发connect

    前言 服务器在调用listen和accept后,就会阻塞在accept函数上,accpet函数返回后循环调用accept函数等待客户的TCP连接. 我们知道服务器段listen套接字能处理的连接数与监 ...

  6. Linux下套接字详解(六)----基于pthread的多线程的TCP套接字(阻塞/同步/并发)

    上节我们实现了一个简单的多进程的服务器程序,这节,我们服务器的框架不做修改,只是将其修改为一个多线程的服务器程序. 直接上代码 server #include <stdio.h> #inc ...

  7. Linux下套接字详解(五)----基于fork多进程的TCP套接字(阻塞/同步/并发)

    简介 一个简单的改进方案是在服务器端使用多线程(或多进程).多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接.具体使用多进程还是多线程,并没有 ...

  8. Linux下套接字详解(补充)--OSI七层与TCP/IP五层网络架构详解

    OSI七层模型 OSI是Open System Interconnect的缩写,意为开放式系统互联. OSI是Open System Interconnect的缩写,意为开放式系统互联. OSI七层参 ...

  9. 3w+字详解 23 种设计模式(多图 + 代码)

    来源:javadoop.com/post/design-pattern 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的

最新文章

  1. 腾讯云https认证
  2. HTML的标签描述8
  3. CreateMutex创建互斥体可以用于只运行进程的一个实例
  4. 量子计算机区别于冯诺依曼机的一个显著特点,大学计算机基础习题答案西安交大.doc...
  5. AIX卷管理介绍以及利用空闲PP来创建文件系统
  6. 112. 路径总和 golang
  7. 【Python】可视化的离散傅里叶变换+快速傅里叶变换后时域信号的频域分析
  8. Telnet配合netty打印数据(springboot+netty)
  9. 【python函数】函数
  10. 数据-第6课-线性表的相关操作
  11. 比赛打分系统的计时器数字或滚动抽签数字不显示的原因解惑
  12. 6.函数基础和函数参数
  13. 计算机四级网络工程师题目,计算机四级网络工程师题库
  14. 51单片机 1.概述及点灯测试
  15. Oracle varchar和varchar2的区别
  16. phpStudy安装框架教程
  17. Shiro记住我(RememberMe)
  18. python tkinter界面随分辨率自动调整尺寸,Tkinter画布自动调整大小
  19. 如何用计算机求特征值特征向量,利用QR算法求解矩阵的特征值和特征向量
  20. NDK开发——FFmpeg实现视频转YUV、视频转RGB显示、音频转PCM、音频播放、音视频同步

热门文章

  1. IE6-7-8 JS关闭窗口不提示的方法
  2. hdu 3172(并查集+hash)
  3. 面试(后台开发,转载)
  4. 1.svn无法连接,2.svn日志无法显示,3.日志无法修改
  5. POJ3278Catch That Cow(BFS)
  6. noip2016 组合数问题
  7. mybais传入多个参数的方法
  8. JavaScript window.getComputedStyle()
  9. 如何判断一个对象是否是数组。
  10. volatile 关键字