1、什么是socket套接字

socket其实就是计算机通信的端口,可以实现两个计算机之间的通信的一个接口,应用程序在网络上传输就是通过这个借口实现。

socket分为三种类型:

字节流套接字(Stream Socket),最常用socket类型,TCP协议使用此类接口。提供面向连接(建立虚拟电路)、无差错、发送顺序一致、无记录边界和非重复的网络信包传输

数据报套接字(Datagram Socket),UDP协议使用此类接口,提供无连接服务,它以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重复的场合。数据报套接字接口的一个重要特点是它保留了记录边界。

原始数据报套接字(Raw Socket),提供对网络下层通讯协议(eg:IP协议)的直接访问,一般不是提供给普通用户的,主要用于开发新的协议或者用于提取协议教隐蔽的功能

2、 客户服务器通信流程

  • 创建套接字

  #include <sys/types.h> /* See NOTES */

  #include <sys/socket.h>

  int socket(int domain, int type, int protocol);//返回sockfd

  函数定义:这个函数返回套接字描述符,它唯一标识一个socket,后续操作用它作为参数来进行一些读写操作,socket函数的三个参数分别为:

  1. 协议域:AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等
  2. socket类型:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等
  3. protocal传输协议类型:IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等

  返回值:整个则返回一个新的描述符,错误返回-1,并有对应的errorno详情见 https://linux.die.net/man/2/socket

  • 绑定IP和port

  #include <sys/types.h>

  #include <sys/socket.h>

  int bind(int sockfd, const struct sockaddr *addr,

         socklen_t addrlen);

  1. sockfd:返回新套接字的描述符
  2. addr:赋给套接字的地址
  3. addrlen:地址的长度

  返回值:正确返回0,错误返回-1,详情见 https://linux.die.net/man/2/bind

  • 监听连接

  #include <sys/types.h>

  #include <sys/socket.h>

  int listen(int sockfd, int backlog);

  1. sockfd:返回新套接字并已绑定地址的描述符
  2. backlog:限制请求连接队列的最大长度,当请求队列满了再次来连接请求就会报ECONNREFUSED,除非底层协议支持重传,这样就会等待前面请求数据传送完毕再进行请求

  返回值:正确返回0,错误返回-1,详情见 https://linux.die.net/man/2/listen

  • 接收连接

  #include <sys/types.h>

  #include <sys/socket.h>

  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

  1. sockfd:返回新套接字并已绑定地址处于监听状态的描述符
  2. addr:准备接受请求数据的地址,一般为客户端套接字地址
  3. addrlen:客户端套接字地址长度

  返回值:成功则返回一个非负的SOCKET类型的值,表示接收到的套接字描述符,错误返回-1,并有对应的errorno,详情见https://linux.die.net/man/2/accept

3、C 程序

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdint.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <error.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
int main(){
struct sockaddr_in server_addr, client_addr;
int socketserver;
int err;
int socketclient;as
struct timeval timeout;
char rcvbuf[];
char sedbuf[];
timeout.tv_sec=;
timeout.tv_usec=;
//socket buff size
int opt=; if((socketserver = socket(AF_INET,SOCK_STREAM,)) == -)
return ;
//接受时限5s
//setsockopt(socketserver, SOL_SOCKET,SO_RCVTIMEO, (char*)&timeout,sizeof(timeout));
//发送时限5s
//setsockopt(socketserver, SOL_SOCKET,SO_SNDTIMEO, (char*)&timeout,sizeof(timeout));
//接收缓冲区
setsockopt(socketserver, SOL_SOCKET, SO_RCVBUF, (const char*)&opt,sizeof(opt));
//发送缓冲区
setsockopt(socketserver, SOL_SOCKET, SO_SNDBUF, (const char*)&opt,sizeof(opt));
//设置服务器地址信息设置
server_addr.sin_family = AF_INET; //TCP
server_addr.sin_port = htons(); //网络字节顺序采用大端模式
server_addr.sin_addr.s_addr = INADDR_ANY; //本地IP地址
// server_addr.sin_addr.s_addr=htonl(127.0.0.1);
printf("server port:%ld\n", ntohs(server_addr.sin_port));
memset(server_addr.sin_zero,'\0',sizeof(server_addr.sin_zero));
err=bind(socketserver, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
if(err == -){
perror("bind error:");
return ;
}
if((err = listen(socketserver,)) == -){
perror("listen error:");
return ;
}
while(){
int len = sizeof(struct sockaddr);
head:
if((socketclient = accept(socketserver,(struct sockaddr *)&client_addr,&len)) == -){
  if(errno == ){
  puts("timeout");
goto head;
}
else{
perror("accpet error:");
return ;
}
}
  write(socketclient,sedbuf,);
  printf("send sucess\n");
  // handle the connection of client
  while(){
  memset(rcvbuf,'\0',);
  len = read(socketclient,rcvbuf,);
  if(len <=){
if(errno == EINTR || errno == EAGAIN)// except interruption XXX 92   
        continue;
   else{
   perror("client down:");
   break;
  }
  }
printf(" I received %s\n",rcvbuf);
  }//while(1) handle the connection of client
  }//while(1)
return ;
}

Linux下C语音实现socket发送和接收的小程序的更多相关文章

  1. SSL握手通信详解及linux下c/c++ SSL Socket代码举例

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html   分享到:8     发布时 ...

  2. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  3. Linux下使用 minicom 自动重复发送数据的实现

    目录 在minicom中添加脚本路径 编写脚本 执行脚本 一个项目里要用的设备需要用串口来模拟传感器来测试,还是Linux下的. 串口助手cutecom很好用,但是不能定时发送数据. 所以用下面这个脚 ...

  4. socket发送和接收数据

    1)sendBuf(),sendText(),sendStream() 几乎所有的通信控件都会提供上面的3个方法.首先看看SendBuf(). function TCustomWinSocket.Se ...

  5. Linux下C语言的socket网络编程

    关于详细的服务器建立的步骤以及相关的socket套接字的知识我已经在python socket编程的文章中提到过了,大家可以参看那一篇博客来历接socket套接字编程的内容,由于要是用C相关的API所 ...

  6. Linux下解决高并发socket最大连接数限制,tcp默认1024个连接

    linux作为服务器系统,当socket运行高并发TCP程序时,通常会出现连接建立到一定个数后不能再建立连接的情况 本人在工作时,测试高并发tcp程序(GPS服务器端程序),多次测试,发现每次连接建立 ...

  7. 实战解读丨Linux下实现高并发socket最大连接数的配置方法

    摘要:Linux操作系统,无论是编写客户端程序还是服务端程序,在高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制. [诉求场景] Linux操作系统,无论是编写 ...

  8. Linux下解决高并发socket最大连接数所受的各种限制(解除IO限制)

    linux作为服务器系统,当运行高并发TCP程序时,通常会出现连接建立到一定个数后不能再建立连接的情况 本人在工作时,测试高并发tcp程序(GPS服务器端程序),多次测试,发现每次连接建立到3800左 ...

  9. TCP/TP编程 - 一个简单的Linux下C写的socket服务器客户端程序

    服务端: hello_server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #in ...

随机推荐

  1. [LeedCode OJ]#85 Maximal Rectangle

     [ 声明:版权全部,转载请标明出处.请勿用于商业用途. 联系信箱:libin493073668@sina.com] 题目链接:https://leetcode.com/problems/maxima ...

  2. 百科知识 STEP文件如何打开

    使用任何的主流三维设计软件Pro/E.UG.CATIA.Solidworks等等都可以直接打开. STEP文件是通用格式,但是在打开的时候不同软件会生成不同的文件,下面是Solidworks打开的效果 ...

  3. sql server 2008出现远程过程调用失败

    sql server  2008出现远程过程调用失败解决方式有下面几种: 1.依照网上说的方法.是由于装了vs 2012或是vs2013或是vs2015等高版本号时.安装了Microsoft SQL ...

  4. jstl的函数

    <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%><%@ tag ...

  5. 在CentOS 7上构建RAID5、LVM和SAMBAserver(5)——架设SAMBAserver

    在CentOS 7上构建RAID5.LVM和SAMBAserver(5)--架设SAMBAserver 6. 架设SAMBAserver 6.1. 预备 本节的任务是配置SAMBA服务,共享/home ...

  6. UVA1422-Processor(二分法+优先队列)

    option=com_onlinejudge&Itemid=8&category=512&page=show_problem&problem=4168"> ...

  7. Kubernetes之网络策略(Network Policy)

    系列目录 概述 Kubernetes要求集群中所有pod,无论是节点内还是跨节点,都可以直接通信,或者说所有pod工作在同一跨节点网络,此网络一般是二层虚拟网络,称为pod网络.在安装引导kubern ...

  8. Struts2 实例(转载)

    一.准备工作及实例 1.解压struts-2.1.6-all.zip apps目录:struts2自带的例子程序docs目录:官方文档. lib 目录:存放所有jar文件. Src 目录:源文件存放地 ...

  9. LeetCode(83)题解: Remove Duplicates from Sorted List

    https://leetcode.com/problems/remove-duplicates-from-sorted-list/ 题目: Given a sorted linked list, de ...

  10. zoj 2711 - Regular Words

    题目:求由A.B.C构成的有序传中长度为n.且每一个B前面的A的个数不少于当前B,每一个C前面的B的个数不少于当前C的个数. 分析:dp,求排列组合数. 考虑二维的状况: 假设 A>=B 则在 ...