一、新手入门

1、socket即为套接字,在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一的标识网络通讯中的一个进程,“IP地址+TCP或UDP端口号”就为socket。

2、在TCP协议中,建立连接的两个进程(客户端和服务器)各自有一个socket来标识,则这两个socket组成的socket pair就唯一标识一个连接。

3、socket本身就有“插座”的意思,因此用来形容网络连接的一对一关系,为TCP/IP协议设计的应用层编程接口称为socket API。

很简单,全部注释了!

二、基本步骤:

1)创建客户端的socket(初始化)。

2)向服务器发起连接请求。

3)与服务端通信,发送一个报文后等待回复,然后再发下一个报文。

4)不断的重复第3)步,直到全部的数据被发送完。

5)第4步:关闭socket,释放资源。

三、代码部分

server.cpp

/*Socket 客户端(server)编程
1)创建客户端的socket(初始化)。2)向服务器发起连接请求。3)与服务端通信,发送一个报文后等待回复,然后再发下一个报文。4)不断的重复第3)步,直到全部的数据被发送完。5)第4步:关闭socket,释放资源。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<unistd.h>
#include<arpa/inet.h>
#include <sys/time.h>
#include <unistd.h>#define MAXLINE 25int main(int argc, char** argv)
{int  listenfd, connfd;struct sockaddr_in  servaddr;char  buff[25];int  n,cnt=0,i;//定义变量int res,ret;//char buf111[8] = {char(0x01),char(0x03),char(0x00),char(0x65),char(0x00),char(0x06),char(0xD5),char(0xD7)};struct  timeval    tv1,tv2;    //时间函数,没有用到!//AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的;而 AF_UNIX 则是 Unix 系统本地通信。//SOCK_STREAM提供面向连接的稳定数据传输,即TCP协议。if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){//创建socket,parameters:地址类型、套接字类型、协议(此处默认TCP)printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);return 0;}//extern void *memset(void *buffer, int c, int count) 把buffer所指内存区域的前count个字节设置成c的值。memset(&servaddr, 0, sizeof(servaddr));//给指定内存初始化,parameters:内存首地址,初始化值,内存大小servaddr.sin_family = AF_INET;//地址家族servaddr.sin_addr.s_addr =htonl(INADDR_ANY);//htonl就是把本机字节顺序转化为网络字节顺序;INADDR_ANY:任何地址,即client绑定任何一个主机地址都可以建立连接servaddr.sin_port = htons(8888);//端口号;htons() 是网络字节序与主机字节序之间转换的函数。//bind服务端把用于通信的地址和端口绑定到socket上if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){//绑定地址和端口,parameters:socket,指向sockaddr_in结构体变量的指针,结构体变量所占内存的大小printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);return 0;}if( listen(listenfd, 10) == -1){//监听套接字printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);return 0;}//通过程序获取刚建立连接的socket的客户端的IP地址和端口号struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);//此处socklen_t为sys/socket.h文件提供,相当于unsigned int类型if((connfd = accept(listenfd,(struct sockaddr *)&cin,&addrlen)) < 0)//接受连接,parameters:监听套接字,指向sockaddr_in结构体变量的指针(存储刚建立连接的socket的客户端的IP地址和端口号),地址(存储客户端结构体长度){printf("accept err\n");exit(1);}char ipv4_addr[16];if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,ipv4_addr,sizeof(cin)))//将数值格式转化为点分十进制的ip地址格式,parameters:地址家族,指向数值格式地址指针,点分十进制的ip地址格式指针,目标存储单元大小{printf("inet_ntop\n");exit(1);}printf("Client(%s:%d) is connected!\n",ipv4_addr,htons(cin.sin_port));printf("======waiting for client's request======\n");while(1){cnt++;printf("%drecv msg from client:",cnt);memset(buff, 0, sizeof(buff));n = recv(connfd, buff, MAXLINE, 0);//不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。parameters:套接字,指向存储数据单元的指针,存储单元的大小,flags 标志if(n > 0){                for(i = 0;i< n;i++)printf("%c ", buff[i]);              }printf("\n"); send(connfd, buff, n,MSG_NOSIGNAL);  //将接收到的数据发送回去,parameters:套接字,指向存储数据单元的指针,存储单元的大小,flags 标志(MSG_NOSIGNAL 禁止向系统发送异常信息)}close(connfd);close(listenfd);return 0;
}

client.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>#define MAXLINE 25int main(int argc, char** argv){int   sockfd, n,i,cnt=0;char  recvline[25], sendline[25];struct sockaddr_in  servaddr;char buf111[8] = {char(0x01),char(0x03),char(0x00),char(0x65),char(0x00),char(0x06),char(0xD5),char(0xD7)};char  buff[25];//创建套接字if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);return 0;}//填写sockaddr_in结构体memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;// servaddr.sin_addr.s_addr=inet_addr("192.168.60.135");servaddr.sin_port = htons(8888);// if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){// printf("inet_pton error for %s\n",argv[1]);//     return 0;// }//发送连接请求if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){printf("connect error: %s(errno: %d)\n",strerror(errno),errno);return 0;}//发送数据、接受数据while(1){sleep(1);cnt++; for(int i=0;i<8;i++){scanf("%c",&buf111[i]);}              send(sockfd, buf111, sizeof(buf111),MSG_NOSIGNAL);printf("%dsend ok\n",cnt);printf("%drecv msg from client:",cnt);memset(buff, 0, sizeof(buff));n = recv(sockfd, buff, MAXLINE, 0);if(n > 0){                for(i = 0;i< n;i++)printf("%02X ", buff[i]);              }printf("\n"); }close(sockfd);return 0;
}

server.cpp与client.cpp同时启动

client中输入地址!

如下:

Linux下Socket TCP编程相关推荐

  1. Linux下Socket网络编程

    什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程, ...

  2. Linux下Socket网络编程之点对点聊天室

    1. 系统设计的目的与意义 掌握信号与信号处理的概念,了解点对点聊天室的设计需求,掌握相关的理论知识,切实掌握程序设计的分析方法,勇于实践,多参考开源项目和代码.实现点对点聊天室程序设计,Linux网 ...

  3. Linux下Socket网络编程send和recv使用注意事项

    1.send函数 ssize_t send( SOCKET s, const char *buf, size_t len, int flags ); (1)send先比较待发送数据的长度len和套接字 ...

  4. linux下socket和MySQL数据库编程

    一.基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打 开 ...

  5. Linux下基于TCP的简易文件传输(socket编程)

    Linux下基于TCP的简易文件传输(socket编程) OSI和TCP/IP: 关于TCP/IP协议 关于TCP协议 TCP编程的一般步骤[^2] TCP文件传输实现 功能概述 服务器编程 客户端编 ...

  6. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  7. 一文了解linux下socket编程

    一文了解linux下socket编程 文章目录 一文了解linux下socket编程 1 网络编程的相关简述 1.1 引言 1.2 Tcp和Udp简介 1.3 TCP三次握手和四次挥手 1.4 网络编 ...

  8. LINUX下Socket编程 函数格式详解

    你需要了解的一些系统调用: socket() bind() connect() listen() accept() send() recv() sendto() recvfrom() close() ...

  9. Linux下Socket编程之TCP应用

    现在,我们用前面所构建的socket类,重新设计<Linux下Socket编程之TCP Server端>中echo的服务器,然后设计客户端程序. echo服务器的工作原理很简单: 1.接收 ...

最新文章

  1. display的block、none、inline属性及解释
  2. kubernetes要实现的目标——随机关掉一台机器,看你的服务能否正常;减少的应用实例能否自动迁移并恢复到其他节点;服务能否随着流量进行自动伸缩...
  3. 【java设计模式】-00目录
  4. was更换java版本,WAS如何更换JDK
  5. endnote参考文献排版_Endnote参考文献管理软件文献插入排版
  6. 解释三度带和六度带的概念以及各坐标系如何定义
  7. root用户登录mysql后新建用户提示1045错误
  8. SQL Server应用程序中的高级SQL注入
  9. fiddler注释_FIDDLER的使用方法及技巧总结
  10. [android界面]android中src和background区别——前景与背景
  11. Atitit.获取某个服务 网络邻居列表 解决方案
  12. Android音视频架构-学习路线规划
  13. 新版眼保健操图解(转)
  14. vue 数字正则表达式详解
  15. 破解Root密码_wuli大世界_新浪博客
  16. 《东周列国志》第十二回 卫宣公筑台纳媳 高渠弥乘间易君
  17. 时间标准 GMT, UTC, CST
  18. Espresso测试框架
  19. Oracle数据库网络详解
  20. 为什么我们选择LambdaMART作为我们的酒店排序模型

热门文章

  1. Android播放提示音
  2. Linux系统安全审核功能
  3. 怎么把图像做成按钮html,html中如何实现使用图像来代替提交按钮的示例
  4. 五.文件的读写+字典
  5. 教育培训机构如何玩转线上打卡工具
  6. LeetCode_514_自由之路
  7. MC我的世界Windows安装forge服务器教程(一)
  8. 路由交换-华为面试问题
  9. sublime 3 编辑器
  10. 自动驾驶 Apollo 源码分析系列,感知篇(七):Lidar 障碍物检测基本流程