重溫網絡編程——協議(二)

前言

在網絡傳輸中有兩種特別出名,一種是tcp,一種是udp。
他們都是基於套接字,tcp 屬於sock_stream 類型,udp 屬於sock_dgram。
sock_steam:服務器

  1. 傳輸過程不會有數據丟失。
  2. 按序傳輸數據。
  3. 傳輸的數據不存在數據邊界。

sock_dgram網絡

  1. 強調快速傳輸而非傳輸順序。
  2. 傳輸的數據有數據邊界。
  3. 傳輸的數據可能會損壞。
    4 限制了每次傳輸數據的大小。

具體能夠參考tcp和udp。dom

關於數據邊界:socket

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

正文

造成一個 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。.net

tcp code

服務器端: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 端:server

#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);
}
相關文章
相關標籤/搜索