windows下的socket編程【清晰,好用的一個例子~】

來源:互聯網
上載者:User

本文來自:查看原文,請點此處O(∩_∩)O哈!

本文以windows socket 進行講解, 開發環境VS2010,測試平台 windows 7

眾所周知TCP(Transmission Control Protocol )是一種連線導向的、可靠的、基於位元組流的通訊協定。而開發TCP socket應用程式是一件比較簡單的事情。下面就用一個比較簡單的demo 講解開發的過程。

該程式分為用戶端和伺服器端,用戶端主要是向伺服器端發送資料,伺服器端主要是對於接收的資料進行顯示。

TCP伺服器端和用戶端的主要流程:

伺服器端:1 建立通訊端 2 綁定 3 監聽  4 接受串連 5 收發資料 6 關閉

用戶端:   1 建立通訊端 2 串連 3 收發資料 4 關閉

實現中用到的主要函數及

伺服器: 1 WSAStartup() 2 socket() 3 bind() 4 listen() 5 accept() 6 recv() 7 closesocket() 8 WSACleanup()

用戶端: 1 WSAStartup() 2 socket() 3 connect() 4 send() 5 closesocket() 6 WSACleanup()

下面是server 和 client 的實現代碼,啟動並執行時候首先啟動server,然後再啟動client, 則在server部分列印出“hello world” 。

Server.cpp  源碼

#include "stdafx.h"#define  BUF_SZIE    64#include "winsock2.h"#pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]){    WSADATA         wsd;    /*初始化套結字動態庫*/    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)    {        printf("WSAStartup failed!\n");        return 1;    }         /*建立通訊端*/    SOCKET sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);     if(INVALID_SOCKET == sServer)    {        printf("socket failed!\n");        WSACleanup();        return  -1;    }         /*伺服器通訊端地址*/    SOCKADDR_IN  addrServ;    addrServ.sin_family = AF_INET;    addrServ.sin_port = htons(4999);    addrServ.sin_addr.s_addr = INADDR_ANY;               /*綁定通訊端*/    int retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));    if (SOCKET_ERROR == retVal)    {           closesocket(sServer);        WSACleanup();        return -1;    }         /*開始監聽*/    retVal = listen(sServer, 1);    if(SOCKET_ERROR == retVal)    {               closesocket(sServer);        WSACleanup();        return -1;    }         /*接受用戶端請求*/    sockaddr_in addrClient;    int addrClientlen = sizeof(addrClient);    SOCKET sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);    if(INVALID_SOCKET == sClient)    {        closesocket(sServer);        WSACleanup();        return -1;    }              /*接收用戶端資料*/    char buf[BUF_SZIE];    ZeroMemory(buf, BUF_SZIE);    retVal = recv(sClient, buf, BUF_SZIE, 0);    if (SOCKET_ERROR == retVal)    {           closesocket(sServer);        closesocket(sClient);           WSACleanup();        return -1;    }     printf("%s\n", buf);     /*退出*/    closesocket(sServer);    closesocket(sClient);    WSACleanup();    getchar();     return 0;}

Client.cpp 源碼

#include "stdafx.h"#define BUF_SZIE    64#include "winsock2.h"#pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]){    WSADATA wsd;    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)    {        printf("WSAStartup failed!\n");        return -1;    }     /*建立通訊端*/    SOCKET sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);       if(INVALID_SOCKET == sHost)    {        WSACleanup();        return  -1;    }     /*設定伺服器位址*/    SOCKADDR_IN     servAddr;    servAddr.sin_family =AF_INET;    servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");    servAddr.sin_port = htons((short)4999);    int nServAddlen  = sizeof(servAddr);     /*串連伺服器*/    int retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));       if(SOCKET_ERROR == retVal)    {           closesocket(sHost);        WSACleanup();        return -1;    }     /*向伺服器發送資料*/    char buf[BUF_SZIE];    ZeroMemory(buf, BUF_SZIE);    strcpy(buf, "Hello world");    retVal = send(sHost, buf, strlen(buf), 0);    if (SOCKET_ERROR == retVal)    {        closesocket(sHost);        WSACleanup();        return -1;    }     /*退出*/    closesocket(sHost);    WSACleanup();     getchar();    return 0;}

PS : 想多說一句,如果一直無法實現通訊,不妨換個連接埠試試~~~

我弄了好久。。。。才發現那個連接埠被佔用了。。。。額。。。。╮(╯▽╰)╭

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.