下面是测试

  • | 如何获取一个socket描述符
  • | 如何将socket描述符与电脑IP绑定
  • | 如何监听
  • | 服务器如何连接
  • | 连通后如何读写数据
  • | 客户端如何连接
  • | 整个TCP的流程是怎么样的

第一节

  • socket描述符就是文件描述符,都是一个int整数,有着身份证的作用

1.1 socket函数

int socket(int domain, int type, int protocol);
功能:设置socket通讯的IP域与端口通信方式后,分配一个socket通信的socket描述符
参数1:domin(域)<==>填写IP域是属于IPv4 / IPv6 / 本地IP
AP_INET=PIv4
AF_INET6=IPv6
AF_LOCAL=本地IP
参数2:type<==>socket的端口通信方式选择

SOCK_STEAM=TCP通信的流式套接字
SOCK_DGRAM=UDP通信的数据报套接字
SOCK_RAW=原始套接字

参数3:protocol(协议)<==>UDP与TCP编程时写0,原始套接字编程时填充
返回值:成功->socket描述符 ; 失败->EOF

1.2 bind函数

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能: 将socket网络地址与socket描述符绑定关联
参数1:sockfd <==> socket获取的socket描述符
参数2:sockaddr网络地址结构体变量的地址(IPv4,IPv6,本地网络的网络地址结构体都是不一样的)
ipv4网络地址结构体如下(man 7 ip 可查看)
:
参数3:socket网络地址结构体的长度
返回值:
On success, zero is returned.
On error, -1 is returned,

1.3 listen函数

  • listen(倾听)
int listen(int sockfd, int backlog);
功能:l因为服务器是被动连接,套接字默认是主动的,所以使用isten()将socket主动套接字转化为被动套接字,让服务器进入监听状态
参数1:socket函数获取的socket描述符
参数2" 最大允许几个客户端进行连接
返回值: On success, zero is returned. On error, -1 is returned

1.4 accept函数

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能: 一直等待客户端连接
参数1:服务器的socket描述符
参数2:客户端套接字网络地址
参数3: 参数2的字节长度
返回值: On success, these system calls return a nonnegative integer that is a descriptor for the accepted socket. On error, -1 is returned
(成功:如果与客户端连接成功,就返回一个新的newfd,用来临时通信,失败的话:-1)

1.5 read / write / close 参考前面的文章

  • 由于socket网络描述符就是文件描述符,所以在accept连接成功后,直接使用read / write / close 函数即可accept返回的操作临时文件描述符newfd

1.6 客户端连接函数connet

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:连接服务器
参数1:客户端的socket描述符
参数2:用于接收客户端的socket网络地址结构体
参数3:用于接收参数2的字节长度
返回值: If the connection or binding succeeds, zero is returned. On error, -1 is returned
服务器ser.c / 客户端cli.c实现C/S通信/*===============================================================
*   Copyright (C) 2020 All rights reserved.
*
*   文件名称:ser.c
*   创 建 者:liujing
*   创建日期:2020年07月24日
*   描    述:
*
*   更新日志:
*
================================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */void main()
{//1:获取socket描述符int socketid;//AF_INET=IPv4//SOCK_STREAM=socket流//0=协议默认socketid = socket(AF_INET,SOCK_STREAM,0);if(socketid!=EOF){printf("\n获取ID成功\n");}else{perror("\n获取ID失败\n");}//2:socket网络地址绑定socket描述符//socket网络地址赋值 --> For AF_INET see ip(7)struct sockaddr_in sockaddr;sockaddr.sin_family = AF_INET;sockaddr.sin_port = 5001; //5000~65535是用户段口号//将点分十进制的IP地址转化为32位地址,存储在sockaddr.sin_addrif(1 == inet_pton(AF_INET,"192.168.43.70",(void*)&sockaddr.sin_addr)){printf("\n转换IP-->32位成功\n");}else{perror("\n转化IP-->位失败\n");}//socket描述符绑定网络地址if(bind(socketid,(struct sockaddr*)&sockaddr,sizeof(sockaddr)) == EOF){perror("\nbind function error\n");}else{printf("\nbind function success\n");}//将网络套接字转化为被动套接字,进入监听状态if(0 == listen(socketid,5)){printf("\n listen function success\n");}else{perror("\nlisten function error:\n");}//等待客户端请求连接struct sockaddr_in cliaddr;int clilen = 0;int newid = -1;printf("\n阻塞等待接入\n");newid = accept(socketid,(struct sockaddr*)&cliaddr,&clilen);if(newid == -1){perror("\naccept function error\n");}else{printf("\naccept function success\n");}//read / write 读取操作文件描述服char buf[32];char sendbuf[32] = "HELLO WORD";int ret;while(1){ret = read(newid,buf,32);write(newid,sendbuf,32);puts(buf);sleep(1);if(ret == 0) //当read / write函数返回0,说明客户端退出,socket连接断开{printf("\nbreak\n");break;  //退出循环}}close(newid);close(socketid);printf("\nend\n");
}/*===============================================================
*   Copyright (C) 2020 All rights reserved.
*
*   文件名称:cli.c
*   创 建 者:liujing
*   创建日期:2020年07月25日
*   描    述:
*
*   更新日志:
*
================================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
void main()
{//1.获取网络套结字描述符int socketid;socketid = socket(AF_INET,SOCK_STREAM,0);//AF_INET=IPv4//SOCK_STREAM=socket流//0=协议默认if(socketid!=EOF){printf("\n获取ID成功\n");}else{perror("\n获取ID失败\n");}//2.连接服务器//socket网络地址赋值 --> For AF_INET see ip(7)struct sockaddr_in sockaddr; //接受客户端的网络地址结构体sockaddr.sin_family = AF_INET;//接受客户端的网络地址结构体的大小sockaddr.sin_port = 5001; //5000~65535是用户段口号//将点分十进制的IP地址转化为32位地址,存储在sockaddr.sin_addrif(1 == inet_pton(AF_INET,"192.168.43.70",(void*)&sockaddr.sin_addr)){printf("\n转换IP-->32位成功\n");}else{perror("\n转化IP-->位失败\n");}if(0 == connect(socketid,(struct sockaddr*)&sockaddr,sizeof(sockaddr))){printf("\nconnet function success\n");}else{perror("connect funtion error");}//3.通信char buf[32] = "hello word";char getbuf[32] = {0};int ret;while(1){write(socketid,buf,32);  //注意:服务器的收发的字节大小应该保持一致ret = read(socketid,getbuf,32);puts(getbuf);sleep(1);if(ret == 0){printf("\n退出循环\n");break;}}close(socketid);printf("\nend\n");
}====================================================================
ser的运行结果截取如下:
farsight@ubuntu:~/Desktop$ gcc cli.c -o cli
farsight@ubuntu:~/Desktop$ gcc ser.c -o ser
farsight@ubuntu:~/Desktop$ ./ser获取ID成功转换IP-->32位成功bind function successlisten function success阻塞等待接入accept function success
hello word
hello word
hello word
hello word
hello word
hello word
hello word
hello word
hello word
hello word
hello word
hello word
hello word
hello wordbreakend
farsight@ubuntu:~/Desktop$
====================================================================
cli的运行结果截取如下:
farsight@ubuntu:~/Desktop$ ./cli获取ID成功转换IP-->32位成功connet function success
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
HELLO WORD
^C
farsight@ubuntu:~/Desktop$ 
  • 服务器的IP地址是动态的话,将网络地址结构体的s_addr地址设置位INADDY_ANY即可

D2 - TCP编程相关推荐

  1. C语言网络编程:TCP编程模型

    编程模型 TCP编程模型如下 TCP服务器的工作过程如下: 服务器创建一个专门的"文件描述符"来监听来自客户端的"三次握手",然后建立链接 链接建立成功后,服务 ...

  2. TCP编程函数和步骤

    TCP编程的服务器端一般步骤是 1. 创建一个socket,用函数socket(): 2. 设置socket属性,用函数setsockopt(); * 可选 3. 绑定IP地址.端口等信息到socke ...

  3. Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...

    TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...

  4. 5.4 异步TCP编程(一)

    2019独角兽企业重金招聘Python工程师标准>>> 摘自<C#网络应用编程>(第2版) 看到网上资料很少,做个摘录,如有版权问题,请告知. 利用TcpListener ...

  5. Python tcp编程,TCP服务端和TCP客户端代码编写

    Python网络编程 两种模式: 一种tcp可靠连接,能够保证数据不丢失 一种udp 不关心数据是否会丢失,在乎传输效率 TCP编程 一点:服务端 二点:客户端 客户端如何连接服务端,保证传输的数据可 ...

  6. socket网络编程——TCP编程流程及端口号占用问题

    1.TCP编程流程 1.1TCP服务器端客户端及方法介绍 TCP 提供的是面向连接的.可靠的.字节流服务.TCP 的服务器端和客户端编程流程如下: socket()方法是用来创建一个套接字,有了套接字 ...

  7. Linux网络编程 之 TCP编程(七)

    目录 1. TCP客户端 - 核心函数 - 完整的TCP客户端程序 2. TCP服务端 - 核心函数 - 完整的TCP客户端程序 TCP编程的核心步骤和流程: 1. TCP客户端 核心函数: 创建一个 ...

  8. JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

  9. python之网络编程 --- TCP编程

    Python的第三方库非常强大,简单易用,简直不要太爽. 首先看一下TCP编程 TCP的服务模型包括面向连接的服务和可靠数据传输服务,首先要进行三次握手,建立全双工连接,连接双方的进程可以在此连接上同 ...

最新文章

  1. 基于Shodan Python库的批量攻击实践 撒旦网
  2. hdu4267线段树段更新,点查找,55棵线段树.
  3. dev layoutview 怎么显示大小_「转」磁盘满了,为啥du却显示还有很大空间?
  4. django与easyui使用过程中遇到的问题
  5. 计算机dos通讯,PC双机通信DOS
  6. 第三节:框架前期准备篇之利用Newtonsoft.Json改造MVC默认的JsonResult
  7. Flink的状态一致性
  8. C++中获得文件大小
  9. 支持多分支语句吗_Go的条件判断语句
  10. 洛谷——P1025 数的划分
  11. 在Linux Redhat 9.0使用YUM
  12. iOS之正则表达式的使用
  13. 刷屏!马化腾:腾讯只是一家普通公司,随时可以被替换
  14. win10系统托盘图标不见了_Win10如何显示系统托盘所有图标
  15. 计算机病毒黑色星期五制造者,计算机病毒复习资料
  16. Semantic UI 之 按钮 button
  17. Linux 多线程同步之哲学家用餐问题分析
  18. 无线传输技术比较:蓝牙、UWB、WIFI、NB-LOT
  19. 取石子c语言,取石子(一)(C语言)
  20. 常用数字与字母的正则表达式(转载)

热门文章

  1. 震撼, tineye
  2. '\U' used without hex digits in character string starting R语言报错
  3. QUIC-HTTP/3介绍
  4. Unity3d 开发(二)Unity 制作可发布插件
  5. DM8168,AM3894,DM8148,AM3874获取sink设备EDID方法
  6. 物联网毕设 stm32的车牌识别系统
  7. 爬虫框架 Scrapy 教程详解
  8. Office办公软件快捷键大全
  9. 【unity】关于枪口瞄准的趣事
  10. Apache中 RewriteCond 规则参数介绍