一、服务端

  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. 【原创】大叔经验分享(70)marathon重启app后一直处于waiting状态

    marathon重启app后一直处于waiting状态,查看marathon日志 # journalctl -u marathon -f 有如下日志: Jun 14 12:58:38 DataOne- ...

  2. JavaScript笔记(3)

    字典(Array对象) Array对象当字典使用时,.length属性就不能使用了 如果想访问对象元素,不能使用索引,只能使用key 如果遍历字典,只能使用for--in语句 字典是另一种可变容器模型 ...

  3. 仍然有人在叫喊C语言已经过时了

    现在,仍然有人在叫喊C语言已经过时了.还有什么值得学习的?看看现在使用Python.PHP和其他语言有多简单.谁去学旧的C语言?是真的吗?作者下载了这两种语言的底层源代码.由于空间的限制,它没有分析框 ...

  4. git 多账户添加ssh秘钥

    生成秘钥的步骤: ssh-keygen -t rsa -C "xxxx@qq.com" 添加秘钥 在不同的域中添加相同的秘钥是没有问题的,比如 github.com / code. ...

  5. ASP.NET中TextBox控件设立ReadOnly="true"后台取不到值

    SP.NET中TextBox控件设置ReadOnly="true"H或Enabled=false后台取不到值 当TextBox设置了ReadOnly="true" ...

  6. MySQL的左连接查询,只取出最大的一条数据

    今天有个需求,是通过两张表进行查询.一对多的关系.通过一个主键,取出其中的一条.开始以为还好,直接用用了left join on进行查询.却发现了问题所在.其他的好弄.开始的写法借鉴这篇博客:http ...

  7. 正确理解这四个重要且容易混乱的知识点:异步,同步,阻塞,非阻塞,5种IO模型

    本文讨论的背景是Linux环境下的network IO,同步IO和异步IO,阻塞IO和非阻塞IO分别是什么 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进 ...

  8. 解决 /etc/init.d/php-fpm no such file or directory等相关问题

    vi /etc/init.d/php-fpm #! /bin/sh # Comments to support chkconfig on CentOS # chkconfig: 2345 65 37 ...

  9. QQ空间添加背景音乐

    QQ空间背景音乐方式 1.QQ音乐添加背景音乐一种是开通绿砖[有矿的忽略此条]2.QQ空间添加网络音乐的方法步骤:1.首先,需要先下载好想要音乐作为QQ空间背景音乐的歌曲文件(建议为MP3格式)[我这 ...

  10. AWK程序设计语言

    一. AWK入门指南 Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务.本章是个入门指南,让你能够尽快地开始编写你自己的程序.第二章将描述整个语言,而剩下的章节将向你展示 ...