重温网络编程——协议(二)

前言

在网络传输中有两种特别出名,一种是tcp,一种是udp。
他们都是基于套接字,tcp 属于sock_stream 类型,udp 属于sock_dgram。
sock_steam:

  1. 传输过程不会有数据丢失。
  2. 按序传输数据。
  3. 传输的数据不存在数据边界。

sock_dgram

  1. 强调快速传输而非传输顺序。
  2. 传输的数据有数据边界。
  3. 传输的数据可能会损坏。
    4 限制了每次传输数据的大小。

具体可以参考tcp和udp。

关于数据边界:

https://blog.csdn.net/boiled_water123/article/details/81951373

正文

形成一个 socket 需要3个参数(int domain,int type,int protocal):
第一个参数是协议族,为什么有个协议族呢?协议族有ip4和ip6等。
就是一个分类,ip6是完全不兼容ip4的,基于ip6的协议也无法与ip4通讯的。
type 代表性的为:sock_steam,sock_dgram
而sock_steam默认的为tcp,sock_dgram 默认的为udp,所以第三位往往传输为0。

tcp code

服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
void ErrorHandling(char *message);

int main(int argc, char * argv[])
{
    WSADATA wsaData;
    SOCKET hServerSock, hClientSock;
    SOCKADDR_IN serverAddr, clientAddr;

    int szclientAddr;
    char message[] = "Hello World";
    if (argc != 2)
    {
        printf("Usage :%<port>\n",argv[0]);
        exit(1);
    }
    if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
        ErrorHandling("WASAtartup() error!");
    }
    hServerSock = socket(PF_INET,SOCK_STREAM,0);
    if (hServerSock==INVALID_SOCKET)
    {
        ErrorHandling("socket() error");
    }
    memset(&serverAddr,0,sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(atoi(argv[1]));

    if (bind(hServerSock,(SOCKADDR *) &serverAddr,sizeof(serverAddr))==SOCKET_ERROR)
    {
        ErrorHandling("bind() error");
    }

    if (listen(hServerSock,5)==SOCKET_ERROR)
    {
        ErrorHandling("listen() Error");
    }

    szclientAddr = sizeof(clientAddr);
    hClientSock = accept(hServerSock,(SOCKADDR *) &serverAddr,&szclientAddr);
    if (hClientSock ==INVALID_SOCKET)
    {
        ErrorHandling("accept error");
    }
    send(hClientSock,message,sizeof(message),0);
    closesocket(hClientSock);
    closesocket(hServerSock);
    WSACleanup();
    return 0;
}

void ErrorHandling(char *message)
{
    fputs(message,stderr);
    fputs('\n',stderr);
    exit(1);
}

client 端:

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
void ErrorHandling(char* message);

int main(int argc,char* argv[]) {
    WSADATA wsaData;
    SOCKET hSocket;
    SOCKADDR_IN servAddr;
    char message[30];
    int strLen, read_len=0,index=0;
    if (argc!=3)
    {
        printf("Usage : %s <IP> <port>\n",argv[0]);
        exit(1);
    }
    if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
        ErrorHandling("WSAStartup() error!");
    }
    hSocket = socket(PF_INET,SOCK_STREAM,0);
    if (hSocket==INVALID_SOCKET)
    {
        ErrorHandling("socket() error");
    }
    memset(&servAddr,0,sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr(argv[1]);
    servAddr.sin_port = htons(atoi(argv[2]));
    if (connect(hSocket,(SOCKADDR*) &servAddr,sizeof(servAddr))==SOCKET_ERROR)
    {
        ErrorHandling("connect() error!");
    }
    while (read_len=read(hSocket, &message[index++],1))
    {
        if (read_len==-1)
        {
            break;
        }
        strLen += read_len;
    }
    printf("Message from server:%s \n",message);
    closesocket(hSocket);
    WSACleanup();
    return 0;
}
void ErrorHandling(char* message) {
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}

原文地址:https://www.cnblogs.com/aoximin/p/12236351.html

时间: 2024-08-30 05:48:12

重温网络编程——协议(二)的相关文章

【UNIX网络编程(二)】基本TCP套接字编程函数

基于TCP客户/服务器程序的套接字函数图如下: 执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型. #include <sys/socket.h> int socket(int family, int type, int protocol);/*返回值:若成功则为非负描述符,若出错则为-1*/ socket函数成功时返回一个小的非负整数值,它与文件描述符类似,把它称为套接字描述符,简称sockfd.family参数指明协议族,被称为协议域.type参数指

游戏网络编程(二)

游戏网络编程(二) 本篇介绍Socket编程,因为我觉得每个开始接触网络编程的人应该都是先从了解socket编程开始的吧.后面介绍的WebSocket也会和Socket编程的概念做比较,因此先介绍下Socket编程. 游戏网络编程二 什么是Socket 常用的Socket函数API WinSock CSocket Socket函数介绍 socket bind listen accept connect sendsendto recvrecvfrom select setsocketoptgets

[转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程的基础,TCP/UDP收发消息都靠它.我们熟悉的web服务器底层依赖它,我们用到的MySQL关系数据库.Redis内存数据库底层依赖它.我们用微信和别

python 网络编程 (二)---tcp

异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 和通信问题有关的socket.error; 2)与查询地址信息有关的socket.gaierror; 3)与其他地址错误有关的socket.herror; 4)与在一个socket上调用settimeout()后,处理超时有关的socket.timeout; import socket, sys, time host = sys.argv[1] textport = sys.argv[2] filename

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接

网络编程(二):戏说非阻塞网络编程

著作权归作者所有. 商业转载请联系作者获得授权非商业转载请注明出处.作者大家可以看我的知乎专栏链接http://zhuanlan.zhihu.com/auxten/20204159这是一个系列的文章之三之四已经写完了会陆陆续续搬到Linuxtone着急的同学可以看 网络编程三从libevent到事件通知机制 网络编程四互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题 在数据加密领域举例子我们经常会提到Alice和Bob我们也继续延续这种传统. 在遥远的1752年的英国电报这种可以

JavaSE——UDP协议网络编程(二)

在 UDP 网络编程中,发送方与接收方没有建立联系,没有明显的服务器端和客户端的区别. 类 DatagramSocket: 此类表示用来发送和接收数据报包的套接字. 主要的构造方法: DatagramSocket():创建实例,绑定本机的默认IP地址,随机选择端口.通常用于客户端编程,没有特定监听的端口,仅仅使用一个临时的.  DatagramSocket(int port):创建实例,指定端口号,即固定监听Port端口的报文.  DatagramSocket(int port, InetAdd

Java 网络编程(二) 两类传输协议:TCP UDP

两类传输协议:TCP,UDP TCP TCP是Transfer Control Protocol(传输控制协议)的简称,是一种面向连接的保证可靠传输的协议. 在TCP/IP协议中, IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一确定Internet上的一台主机. 而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 通过TCP协议传输,得到的是一个顺序的无差错的数据流. 发送方和接收方的成对的两个socket之间

c++ 网络编程(二)TCP/IP linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9612820.html LINUX下: 一.服务端代码 下面用了多个close来关闭文件描述符,可能有的小伙伴会有疑惑....我就说一句,创建进程的时候会把父进程的资源都复制 一份,而你这个子进程只需要保留自己需要处理的资源,其他的自然要关闭掉, 不然父亲一个儿子一个 待会打起来怎么办  嘿嘿 注意了:就像进程间的通信需要属于操作系统的资源管道来进行,套接字也属于操作系统,所以创建新进程也还是