Linux网络编程二、tcp连接API
一、服务端
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的更多相关文章
- Linux网络编程(二)
Linux网络编程(二) 使用多进程实现服务器并发访问. 采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- Linux 网络编程二(Socket创建)
TCP通信 一个程序使用套接字需要执行4个步骤. --分配套接口和初始化 --连接 --发送或接收数据 --关闭套接字 涉及到的调用包括socket.bind.listen.connect(阻塞线程) ...
- 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...
- linux网络编程系列-TCP/IP模型
### OSI:open system interconnection ### 开放系统互联网模型是由ISO国际标准化组织定义的网络分层模型,共七层 1. 物理层:物理定义了所有电子及物理设备的规范, ...
- 【Linux 网络编程】TCP/IP四层模型
应用层.传输层.网络层.链路层 链路层:常用协议 ARP(将物理地址转化为IP地址) RARP(将IP地址转换为物理地址) 网络层(IP层):重要协议ICMP IP IGMP 传输层:重要的协议TCP ...
- Linux网络编程系列-TCP传输控制
滑动窗口(sliding window) 滑动窗口是用于流量控制的,发送端根据接收端的处理能力发送数据,不至于造成过多的丢包. 是发送方和接收方间的协调,对方的接收窗口大小就是自己的发送窗口大小. 在 ...
- linux网络编程笔记——TCP
1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直 ...
- Linux 网络编程(TCP)
客户端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/sock ...
随机推荐
- Open API
OAuth和SSO都可以做统一认证登录,但是OAuth的流程比SSO复杂.SSO只能做用户的认证登录,OAuth不仅能做用户的认证登录,开可以做open api开放更多的用户资源. Open API即 ...
- 怎样使用 v-for ?
v-bind / v-on / v-if / v-for , 这四个指令应该是 vue 里面最常用的了, 之前已经简单记录的前三个的使用方法, 接下来就记一下 v-for 的基本用法. 1. v-fo ...
- shiro过滤器机制
shiro内置过滤器介绍 https://blog.csdn.net/qq_35608780/article/details/71703197 Shiro的Filter机制详解---源码分析 http ...
- asp.net 8 Request,Response,Server
Request成员: 1.Request.UrlReferrer 获取请求的来源,可以防盗链 Response.Write(Request.Url.ToString());//获取当前请求的URL地址 ...
- 弹窗插件 layer
官方网站 http://layer.layui.com/ Github 地址 https://github.com/sentsin/layer //在这里面输入任何合法的js语句 layer.open ...
- WebStorm 启动时提示Failed to load JVM DLL
环境:win7 64位:时间:2019-11-18 问题描述 启动webstorm 时提示failed to load JVM DLL 解决方法 启动时快捷方式要选到64位的exe
- React中使用遍历
1.使用for(let item of items){} render(){ var itemList = [] for(let item of items){ itemList.push(<I ...
- Windows 下的快捷键
电脑快捷键小技巧window健 + r → msconfig 查看电脑的开机启动项window健 + r → notepad 无标题的记事本window健 + r ...
- Python之for循环与while循环
for语句格式for x in range(起始值,结束值,步幅) 执行语句输出0,100各个数字for i in range(0,101) print(i)输出0,100的偶数for i in ra ...
- Linux下Mysql 不能访问新数据文件夹问题
新挂载的盘,打算将数据文件夹配置到 /data/mysql,却无法启动mysqld. 除了将目录授权给mysql用户和组以外 chown -R mysql:mysql /data/mysql 太需要将 ...