一、服务端

  1、创建套接字:

    int socket(int domain, int type, int protocol);

      domain:指定协议族,通常选用AF_INET。

      type:指定socket类型,TCP通信下使用SOCK_STREAM。

      protocol:指定协议,通常为0。

      返回值:成功则返回新socket的文件描述符,失败返回-1。

      头文件:sys/socket.h     sys/types.h

  2、绑定套接字

    int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

      sockfd:要绑定的套接字。

      my_addr:本地地址,使用sockaddr_in结构体创建。

      addrlen:my_addr的长度。

      返回值:成功返回0,失败返回-1。

  3、监听套接字

    int listen(int s, int backlog);

      s:要监听的套接字

      backlog:指定未完成连接队列的最大长度,如果一个连接请求到达时为完成连接队列已满,那么客户端将会接收到错误。

      返回值:成功返回0,失败返回-1。

  4、接受连接

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

      s:接收连接请求的套接字。

      addr:获取客户端信息。

      addrlen:addr的长度。

      返回值:成功返回一个非负整数表示的连接套接字,失败返回-1。

  5、读取数据

    ssize_t read(int fd, void *buf, size_t count);

      fd:文件描述符。

      buf:缓冲区,读取的数据放在缓冲区中。

      count:缓冲区大小。

      返回值:成功返回读取到的字节数,失败返回-1。

      注:read会阻塞。

    ssize_t recv(int sockfd, void *buf, size_t len, int flags);

      flags:一般设置为0。

      其余同上

  6、写数据

    ssize_t write(int fd, const void *buf, size_t count);

      同上。

    int send(int s, const void *msg, size_t len, int flags);

      同上。

  7、关闭套接字

    int close(int fd);

      fd:要关闭的套接字。

      返回值:成功返回0,失败返回-1。

  8、其他

    将本地编码转为网络编码

    #include <arpa/inet.h>

    uint32_t htonl(uint32_t hostlong);

    uint16_t htons(uint16_t hostshort);

    uint32_t ntohl(uint32_t netlong);

    uint16_t ntohs(uint16_t netshort);

    将网络编码转为本地

    const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

      af:协议族。

      src:原数据。

      dst:缓冲区。

      size:缓冲区大小。

      返回值:成功返回转换后的字符串,失败返回NULL。

//tcp_server.c
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
const int lfd=socket(AF_INET,SOCK_STREAM,);
if(lfd==-)
{
perror("socket error");
exit();
}
struct sockaddr_in server;
memset(&server,,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons();
server.sin_addr.s_addr=htonl(INADDR_ANY);
//设置端口复用
int flag=;
setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&flag,sizeof(flag));
int ret=bind(lfd,(struct sockaddr*)&server,sizeof(server));
if(-==ret)
{
perror("bind error");
exit();
}
ret=listen(lfd,);
if(ret==-)
{
perror("listen error");
exit();
}
struct sockaddr_in client;
socklen_t len=sizeof(client);
int cfd =accept(lfd,(struct sockaddr*)&client,&len);
if(cfd==-)
{
perror("accept error");
exit();
}
printf("accept successful !!!\n");
char ipbuf[]={};
printf("client IP: %s,port: %d\n",inet_ntop(AF_INET,&client.sin_addr.s_addr,ipbuf,sizeof(ipbuf)),ntohs(client.sin_port));
while()
{
char buf[]={};
int len=read(cfd,buf,sizeof(buf));
if(len==-)
{
perror("read error");
exit(); }
else if(len==)
{
close(cfd);
break;
}
else
{
printf("recv buf: %s\n",buf);
for(int i=;i<len;++i)
{
buf[i]=toupper(buf[i]); }
printf("send buf: %s\n",buf);
write(cfd,buf,len);
}
}
close(cfd);
close(lfd);
return ;
}

二、客户端

  1、创建套接字

    int socket(int domain, int type, int protocol);

  2、连接客户端

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

      sockfd:客户端创建的套接字。

      addr:配置的要连接的服务器。

      addrlen:addr的长度。

      返回值:成功返回0,失败-1。

  3、通信

    同服务端,略。

tcp_client.c:

 #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc,char *argv[])
{
int lfd=socket(AF_INET,SOCK_STREAM,);
int port=atoi(argv[]);
struct sockaddr_in serv;
serv.sin_family=AF_INET;
serv.sin_port=htons(port);
inet_pton(AF_INET,"127.0.0.1",&serv.sin_addr.s_addr);
connect(lfd,(struct sockaddr*)&serv,sizeof(serv));
while()
{
char buf[];
fgets(buf,sizeof(buf),stdin);
write(lfd,buf,strlen(buf));
memset(buf,,sizeof(buf));
int len=read(lfd,buf,sizeof(buf));
if(len==-)
{
perror("read err");
return -;
}
else if(len==)
{
break;
}
else
{
write(STDOUT_FILENO,buf,len);
}
}
close(lfd);
return ;
}

Linux网络编程二、tcp连接API的更多相关文章

  1. Linux网络编程(二)

    Linux网络编程(二) 使用多进程实现服务器并发访问. 采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来 ...

  2. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  3. Linux 网络编程二(Socket创建)

    TCP通信 一个程序使用套接字需要执行4个步骤. --分配套接口和初始化 --连接 --发送或接收数据 --关闭套接字 涉及到的调用包括socket.bind.listen.connect(阻塞线程) ...

  4. 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...

  5. linux网络编程系列-TCP/IP模型

    ### OSI:open system interconnection ### 开放系统互联网模型是由ISO国际标准化组织定义的网络分层模型,共七层 1. 物理层:物理定义了所有电子及物理设备的规范, ...

  6. 【Linux 网络编程】TCP/IP四层模型

    应用层.传输层.网络层.链路层 链路层:常用协议 ARP(将物理地址转化为IP地址) RARP(将IP地址转换为物理地址) 网络层(IP层):重要协议ICMP IP IGMP 传输层:重要的协议TCP ...

  7. Linux网络编程系列-TCP传输控制

    滑动窗口(sliding window) 滑动窗口是用于流量控制的,发送端根据接收端的处理能力发送数据,不至于造成过多的丢包. 是发送方和接收方间的协调,对方的接收窗口大小就是自己的发送窗口大小. 在 ...

  8. linux网络编程笔记——TCP

    1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直 ...

  9. Linux 网络编程(TCP)

    客户端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/sock ...

随机推荐

  1. java中的接口和php的接口的区别

    php: 规范: 接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量. 在接口中的抽象方法只能是public的,默认也是public权限. abstract和final修饰符也不能修饰接口中 ...

  2. 虚拟机centos7执行ip addr命令看不到ip地址

    转:https://blog.csdn.net/weixin_43343006/article/details/100094624 进入ect/sysconfig/network-scripts目录在 ...

  3. LeetCode 172:阶乘后的零

    给定一个整数 n, 返回 n! 结果中尾数为零的数量. 示例 : 输入: 输出: 解释: ! = , 尾数中没有零. 示例 : 输入: 输出: 解释: ! = , 尾数中有个零. 说明:算法的时间复杂 ...

  4. js之常用正则

    //用户名正则,4到16位(字母,数字,下划线,减号) let uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母, ...

  5. webpack提取公共js代码

    webpack打包js代码与提取公共js代码分析 webpack提取公共js代码示例 一.分析 webpack默认打包js代码时,是将从入口js模块开始,将入口js模块所依赖的js以及模块逐层依赖的模 ...

  6. openlayers加载天地图过程中遇到跨域问题

    // 采用openlayers加载天地图 var layer = new ol.layer.Tile({ source: new ol.source.XYZ({ // crossOrigin: 'An ...

  7. 第九章、import 和from ...import

    目录 第九章.import 和from ...import 一.import和 from ...import ... 二.import模块名 第九章.import 和from ...import 一. ...

  8. 织梦dedecms自定义功能函数(1):调用body中的图片(可多张)

    前言 岛主会整理或者开发一系列常用功能函数.所有自定义功能函数都是放在\include\extend.func.php文件里. 这次织梦自定义功能函数功能为:独立提取 body字段中(可以是自定义字段 ...

  9. Mysql(三)-3:完整性约束

    一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...

  10. deep_learning_Function_tensorboard的使用

    数据可视化(网页能打开,但是没有数据):https://jingyan.baidu.com/article/e9fb46e1c55ac93520f7666b.html