• IPv4套接口地址结构

    •   IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件中
    •   LINUX结构下的常用结构,一般创建套接字的时候都要将这个结构里面的值进行初始化
    • struct sockaddr_in
      {
      sa_family_t sin_family; /* address family: AF_INET */
      in_port_t sin_port; /* port in network byte order(网络字节序) */
      struct in_addr sin_addr; /* internet address */
      };
      /* Internet address. */
      struct in_addr
      {
      uint32_t s_addr; /* address in network byte order */
      };
  • socket函数 
    • #include <sys/types.h>
      #include <sys/socket.h>
      int socket(int domain, int type, int protocol); //创建一个套接字用于通信 参数分析
      domain:指定通信协议族(protocol family),常用取值AF_INET(IPv4)
      type:指定socket类型, 流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAW
      protocol:协议类型,常用取值0, 使用默认协议
      返回值:
      成功: 返回非负整数,套接字;
      失败: 返回-1
  • bind函数
    • int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);  //addrlen--地址长度
      绑定一个本地地址到套接字。绑定函数
      参数:
      sockfd:socket函数返回的套接字
      addr:要绑定的地址
  • listen函数
    • int listen(int sockfd, int backlog);
        listen函数应该用在调用socket和bind函数之后, 并且用在调用accept之前, 用于将一个套接字从一个主动套接字转变成为被动套接字。
      使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。 sockfd 一个已绑定未被连接的套接字描述符
      backlog说明:
      对于给定的监听套接口,内核要维护两个队列:
      1、已由客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程(SYN_RCVD状态)
      2、已完成连接的队列(ESTABLISHED状态)
      但是两个队列长度之和不能超过backlog

      
      
  • accept函数
    • int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
      
      sockfd:服务器套接字
      addr:将返回对等方的套接字地址, 不关心的话, 可以设置为NULL
      addrlen:返回对等方的套接字地址长度, 不关心的话可以设置成为NULL, 否则一定要初始化
  • connect函数
    • int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
      
      建立一个连接至addr所指定的套接字
      参数:
      sockfd:未连接套接字
      addr:要连接的套接字地址
      addrlen:第二个参数addr长度
  • inet_aton
    •   将一个字符串的ip地址字节转换成了一个一个32位的网络序列IP地址

      int inet_aton(const char *string, struct in_addr*addr);
      
      string是表示的是要转换的字符串ip地址,后面的是网络序列ip地址
      成功返回非0,不成功返回-1
  • 客户端和服务器端练习(server\client)
    •   分别建立两个工程,一个server,一个client。然后先打开服务端,再打开客户端进行测试,源代码如下。

      //服务器端
      #pragma comment(lib,"ws2_32.lib")
      #include<iostream>
      #include<winsock2.h>
      #include<string>
      #include<stdio.h>
      using namespace std; int main(){
      //创建套接字
      WORD myVersionRequest;
      WSADATA wsaData; //包含系统所支持的winsocket版本信息
      myVersionRequest = MAKEWORD(, ); //初始化版本1.1
      int err;
      err = WSAStartup(myVersionRequest, &wsaData); if (!err){
      cout << "已经打开套接字" << endl;
      }
      else{
      //进一步绑定套接字
      cout << "套接字未打开" << endl;
      return ;
      } //创建可识别套接字 调用socket函数
      SOCKET serSocket = socket(AF_INET, SOCK_STREAM, ); //需要绑定的参数
      SOCKADDR_IN addr;
      addr.sin_family = AF_INET;
      addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//ip地址
      addr.sin_port = htons();//绑定端口 //将套接字绑定到指定的网络地址
      bind(serSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR));//绑定完成
      //监听连接
      listen(serSocket, ); //第二个参数代表能够接受的最多的连接数
      //建立客户端的连接
      SOCKADDR_IN clientsocket;
      int len = sizeof(SOCKADDR);
      SOCKET serConn;
      //等待客户端的连接
      serConn = accept(serSocket, (SOCKADDR*)&clientsocket, &len); //返回一个数字 接受函数,不是-1就是接受连接成功
      cout << "客户端" << inet_ntoa(clientsocket.sin_addr) << "已连接" << endl; //客户端已连接 while () {
      char sendBuf[]; //发送的字节
      sprintf_s(sendBuf, "server : welcome %s to server.", inet_ntoa(clientsocket.sin_addr)); //转换函数,将二进制的ip序列转换成char数组
      //在对应的IP处并且将这行字打印到那里
      send(serConn, sendBuf, strlen(sendBuf) + , );
      char receiveBuf[]; //收到的字节
      //接收客户端传来的信息
      recv(serConn, receiveBuf, strlen(receiveBuf) + , );
      char* quit = "quit";
      //如果客户端传来了quit信号,则服务端关闭,客户端也关闭
      if (!strcmp(receiveBuf, quit)) {
      break;
      }
      printf("%s\n", receiveBuf);
      } closesocket(serConn); //关闭
      WSACleanup(); //释放资源的操作
      }
      //客户端
      #pragma comment(lib,"ws2_32.lib")
      #include<winsock2.h>
      #include<iostream>
      #include<string>
      #include<conio.h>
      using namespace std;
      int main(){ WORD versionRequired;
      WSADATA wsaData; //包含系统所支持的WinStock版本信息
      versionRequired = MAKEWORD(, ); //初始化版本1.1
      int err;
      //注册WinStock,返回状态
      err = WSAStartup(versionRequired, &wsaData);//协议库的版本信息
      if (!err) { //返回结果为0表示初始化失败{
      cout << LPSTR("客户端套接字已经打开!\n");
      }
      else{
      //调用WSAGetLastError()查看错误信息
      cout << ("客户端套接字打开失败:") << WSAGetLastError() << endl;
      return ;//结束
      }
      /*
      创建套接字:
      流式套接字: SOCK_STREAM , IPPROTO_TCP
      数据报套接字: SOCK_DGRAM , IPPROTO_UDP
      */ SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建流式套接字
      SOCKADDR_IN clientsock_in; //专门针对Internet 通信域的Winsock地址结构
      clientsock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //通过inet_addr结构指定套接字的主机IP地址
      clientsock_in.sin_family = AF_INET; //指定协议家族:AF_INET
      clientsock_in.sin_port = htons(); //指定将要分配给套接字的传输层端口号:6000 //开始连接
      int fail = connect(clientSocket, (SOCKADDR*)&clientsock_in, sizeof(SOCKADDR));
      if (fail){
      cout << "与服务端连接失败!程序将退出..." << endl;
      _getch();
      return ;
      }
      string s;
      while (cin >> s){
      char receiveBuf[];
      //接收数据
      recv(clientSocket, receiveBuf, , );
      cout << receiveBuf << endl;
      //发送数据
      send(clientSocket, s.c_str(), s.length() + , );
      if (s == "quit"){
      break;
      }
      }
      closesocket(clientSocket);//关闭套接字 if (WSACleanup() == SOCKET_ERROR){
      cout << "套接字关闭失败:" << WSAGetLastError() << endl;
      }
      else{
      cout << "套接字成功关闭." << endl;
      }
      _getch();
      return ;
      }
    •   程序运行截图

Socket编程--基础(基本server/client实现)的更多相关文章

  1. socket编程基础-字节序/IP/PORT转换/域名

    socket编程基础 网络IP操作函数 字符串的IP和32位的IP转换 #include <sys/socket.h> #inlcude <netinet/in.h> #inc ...

  2. 一个linux下socket编程的例子,client连server

    关于socket编程,以下文章写得比较好:http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html 1. accept()函 ...

  3. c#socket编程基础

    Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类 ...

  4. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  5. java socket编程基础(转)

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  6. 【转】Java Socket编程基础及深入讲解

    原文:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html#q2.3.3 Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要 ...

  7. 【Socket】Java Socket编程基础及深入讲解

    Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...

  8. 你得学会并且学得会的Socket编程基础知识

    这一篇文章,我将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解. 本文源代码,可以通过这里下载 http://files.cnblog ...

  9. 【socket编程基础模板】

    网络编程的基础是基于socket编程.socket(TCP)编程基于固定编程模板 server端: socket(声明socket类型) bind(命令socket,绑定地址和端口) listen(创 ...

随机推荐

  1. poj1325

    给出一系列任务,每个任务可以在机器A的某个模式,或者在机器B的某个模式下完成.机器A和B每切换一次模式需要重启一次.问完成这些任务,最少需要重启机器多少次? 把任务看作边 “重启”操作看作点 这道题就 ...

  2. POJ - 2891 Strange Way to Express Integers (扩展中国剩余定理)

    题目链接 扩展CRT模板题,原理及证明见传送门(引用) #include<cstdio> #include<algorithm> using namespace std; ty ...

  3. 【redis】redis的 key的命名规则

    key的命名规则 定义为 MS-TEN:SESSION_KEY_IN_LOGIN_NAME:fqh 使用:进行分割,这样存入redis的是有层次结构的,如下

  4. Linux应用函数 -- 字符串

    1.strchr 原型 char *strchr(const char* _Str,char _Val) 头文件 string.h 功能 查找字符串_Str中首次出现字符_Val的位置 返回值  成功 ...

  5. U盘操作

    一.8G的U盘被设置为2G,如何恢复 1.下载usboot 1.7 打开以后,选中U盘,点击[点击此处选择工作模式],选择[用0重置参数] ,然后点[开始].2.完成后它会提示拔下U盘,此时拔下U盘, ...

  6. (转)SC Create 创建一个Windows系统服务

    本文转载自:http://blog.sina.com.cn/s/blog_62b8fc330100l9px.html C:\Users\sophiaX>sc 描述: SC 是用于与服务控制管理器 ...

  7. JavaScript 中事件绑定的三种方式

    以下是在 JS 中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="uplo ...

  8. 环境搭建:Vue环境搭建和项目初始化(windows)

    1.    安装node.js 官网下载安装:https://nodejs.org/en/ 版本查看:node -v 注意:node版本最好新一点好,推荐6.0以上. 2.    npm安装webpa ...

  9. Rails中render和redirect_to的区别

    共同点: render 和redirect_to 都是执行页面跳转,但是,写在这两个方法后面的语句仍然会被执行. 不同: render:简单的页面渲染,可以指定渲染的页面或布局文件,但是不会发出请求, ...

  10. 将CDM中所有以Relatonship_开头的关系全部重命名,避免生成数据库因为重复关系名报错

    Option   Explicit ValidationMode   =   True InteractiveMode =   im_Batch Dim   mdl   '当前model '获取当前活 ...