1. 程式人生 > >【tcp-ip學習總結】使用tcp協議實現簡單的通訊小程式

【tcp-ip學習總結】使用tcp協議實現簡單的通訊小程式

環境:vs2013

server.c

#include<Winsock2.h>
#include<stdio.h>
#pragma comment(lib,"Ws2_32.lib")
#include<stdlib.h>

void main()
{
    WSADATA wsaData;//協議棧
    struct sockaddr_in server, client;//服務端和客戶端的地址
    int iLen;
    char recMessage[1024]; //接受字串緩衝區
    SOCKET sAccept;//連線上來的那個客戶端套介面
memset(recMessage, 0, sizeof(recMessage));//將接收緩衝區內容全部變為0 printf("-------------------------\n"); printf("伺服器在等待\n"); printf("-------------------------\n"); /* 檢查協議棧是否載入成功 */ if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("協議棧載入失敗!\n"); return
; } //建立伺服器端套介面 SOCKET sListen = socket(AF_INET, SOCK_STREAM, 0); if (sListen == INVALID_SOCKET) { printf("sListen套介面建立失敗!\n"); return; } //為server端地址賦值 server.sin_family = AF_INET; server.sin_port = htons(8888); server.sin_addr.s_addr = htonl(INADDR_ANY); //將服務端地址和服務端socket套介面繫結到一起
if (bind(sListen, (LPSOCKADDR)&server, sizeof(server)) == SOCKET_ERROR) { printf("繫結失敗!\n"); return; } //開始監聽 if (listen(sListen, 5) == SOCKET_ERROR) { printf("監聽失敗!\n"); return; } //客戶端地址長度 iLen = sizeof(client); while (1) { //得到連線上來的那個客戶端套介面 sAccept = accept(sListen, (struct socketaddr*)&client, &iLen); if (sAccept == INVALID_SOCKET) { printf("接受失敗!"); break; } printf("接受的客戶端的地址IP是:[%s], port[%d]\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); //接收資料 while (1) { //從這個客戶端套介面上面接收資訊 int recLen = recv(sAccept, recMessage, sizeof(recMessage), 0); if (recLen == 0) return; else if (recLen == SOCKET_ERROR) { printf("接收失敗!\n"); } printf("沸沸騰:%s\n", recMessage); } } closesocket(sAccept);//關閉套介面 closesocket(sListen); WSACleanup();//清空協議棧 }

client.c

#include<Winsock2.h>
#include<stdio.h>
#pragma comment(lib,"Ws2_32.lib")
#include<stdlib.h>

void  main()
{
    WSADATA wsaData;//協議棧
    struct sockaddr_in server;//server端的地址情況
    SOCKET sClient;//客戶端套介面

//載入協議棧
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("協議棧載入失敗!\n");
        return;
    }
//初始化伺服器端的地址,與埠情況
    server.sin_family = AF_INET;
    server.sin_port = htons(8888);
    server.sin_addr.s_addr = inet_addr("172.17.152.206");
    //建立一個tcp的套介面
    sClient = socket(AF_INET, SOCK_STREAM, 0);

    if (sClient == INVALID_SOCKET)
    {
        printf("套介面建立失敗!\n");
        return;
    }
    //向伺服器端申請連線
    if (connect(sClient, (struct sockaddr*)&server, sizeof(server)) == INVALID_SOCKET)
    {
        printf("連線失敗!\n");
        return;
    }

    for (int i = 0; i < 5; i++)
    {
        printf("田騰飛: ");
        char message[1024];
        gets_s(message,1024);
        //向客戶端套介面傳送資料
        int iSend = send(sClient, message, sizeof(message), 0);
        if (iSend == SOCKET_ERROR)
        {
            printf("傳送失敗!\n");
            break;
        }
        else if (iSend == 0)
            break;
        else
        {
            printf("傳送成功!\n");
        }


    }

    closesocket(sClient);//關閉套介面
    WSACleanup();//清楚協議棧
}