一、服务端

  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. Open API

    OAuth和SSO都可以做统一认证登录,但是OAuth的流程比SSO复杂.SSO只能做用户的认证登录,OAuth不仅能做用户的认证登录,开可以做open api开放更多的用户资源. Open API即 ...

  2. 怎样使用 v-for ?

    v-bind / v-on / v-if / v-for , 这四个指令应该是 vue 里面最常用的了, 之前已经简单记录的前三个的使用方法, 接下来就记一下 v-for 的基本用法. 1. v-fo ...

  3. shiro过滤器机制

    shiro内置过滤器介绍 https://blog.csdn.net/qq_35608780/article/details/71703197 Shiro的Filter机制详解---源码分析 http ...

  4. asp.net 8 Request,Response,Server

    Request成员: 1.Request.UrlReferrer 获取请求的来源,可以防盗链 Response.Write(Request.Url.ToString());//获取当前请求的URL地址 ...

  5. 弹窗插件 layer

    官方网站 http://layer.layui.com/ Github 地址 https://github.com/sentsin/layer //在这里面输入任何合法的js语句 layer.open ...

  6. WebStorm 启动时提示Failed to load JVM DLL

    环境:win7 64位:时间:2019-11-18 问题描述 启动webstorm 时提示failed to load JVM DLL 解决方法 启动时快捷方式要选到64位的exe

  7. React中使用遍历

    1.使用for(let item of items){} render(){ var itemList = [] for(let item of items){ itemList.push(<I ...

  8. Windows 下的快捷键

    电脑快捷键小技巧window健 + r   →  msconfig       查看电脑的开机启动项window健 + r   →  notepad        无标题的记事本window健 + r ...

  9. Python之for循环与while循环

    for语句格式for x in range(起始值,结束值,步幅) 执行语句输出0,100各个数字for i in range(0,101) print(i)输出0,100的偶数for i in ra ...

  10. Linux下Mysql 不能访问新数据文件夹问题

    新挂载的盘,打算将数据文件夹配置到 /data/mysql,却无法启动mysqld. 除了将目录授权给mysql用户和组以外 chown -R mysql:mysql /data/mysql 太需要将 ...