Windows網絡編程



歡迎關注我的新博客https://pino-hd.github.io景东,最新的博文都會發(fā)布在上面哦~

前言

因為在寫代碼的時候感覺用VS太過臃腫,每次寫個程序還要創(chuàng)建一個項目谒养,并且特別占用空間桶蝎,因此安裝了mingw杠娱,可以在命令行中直接gcc編譯,特別方便与学,安利一下~
并且在編譯socket程序的時候彤悔,一定要加上-l wsock32選項,因為mingw默認沒有包含windows庫

TCP版本

  • SERVER端
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>

int main(int argc, char* argv[]) {
    WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2, 2);
    if (WSAStartup(sockVersion, &wsaData) != 0) {
        return 0; 
    }
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sListen == INVALID_SOCKET) {
        printf("socket error\n");
        return 0;
    }
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(4500);
    sin.sin_addr.S_un.S_addr = INADDR_ANY;
    if (bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) {
        printf("socket error\n");
        closesocket(sListen);
        return 0;
    }
    if (listen(sListen, 5) == SOCKET_ERROR) {
        printf("socket error\n");
        closesocket(sListen);
        return 0;
    }
    struct sockaddr_in remoteAddr;
    SOCKET sClient;
    int nAddrLen = sizeof(remoteAddr);
    char revData[255];
    while(TRUE){
        sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
        if (sClient == SOCKET_ERROR) {
            printf("accept() error\n");
            continue;
        }
        printf("接受到一個連接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
        int ret = recv(sClient, revData, 255, 0);
        if (ret > 0) {
            revData[ret] = 0x00;
            printf(revData);
        }
        char* buff = (char*)"\r\nHello, my friend\r\n";
        send(sClient, buff, strlen(buff), 0);
        closesocket(sClient);
    }
    closesocket(sListen);
    WSACleanup();
    return 0;



}
  • CLIENT端
#include <WinSock2.h>
#include <stdio.h>

#pragma comment(lib, "ws2_32.lib")

int main(int argc, char* argv[]) {
    WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2, 2);
    if (WSAStartup(sockVersion, &wsaData) != 0) {
        return 0;
    }
    SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sClient == SOCKET_ERROR) {
        printf("socket error\n");
        return 0;
    }
    struct sockaddr_in servAddr;
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(4500);
    servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    if (connect(sClient, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) {
        printf("socket error\n");
        closesocket(sClient);
        return 0;
    }
    char* buff = (char*)"\r\nHello, my friend\r\n";
    send(sClient, buff, strlen(buff), 0);
    char revData[255];
    int ret = recv(sClient, revData, 255, 0);
    if (ret > 0) {
        revData[ret] = 0x00;
        printf(revData);
    }
    closesocket(sClient);
    WSACleanup();
    return 0;
}
  • 編譯
gcc server.c -o server -lwsock32
gcc client.c -o client -lwsock32

UDP版本

  • SERVER端
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>


int main(int argc, char* argv[])
{
    WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2, 2);
    if (WSAStartup(sockVersion, &wsaData) != 0)
    {
        return 0;
    }

    SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (serSocket == INVALID_SOCKET)
    {
        printf("socket error !");
        return 0;
    }

    struct sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8000);
    serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
    if (bind(serSocket, (SOCKADDR*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
    {
        printf("bind error !");
        closesocket(serSocket);
        return 0;
    }

    struct sockaddr_in remoteAddr;
    int nAddrLen = sizeof(remoteAddr);
    while (TRUE)
    {
        char recvData[255];
        int ret = recvfrom(serSocket, recvData, 255, 0, (SOCKADDR*)&remoteAddr, &nAddrLen);
        if (ret > 0)
        {
            recvData[ret] = 0x00;
            printf("接受到一個連接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
            printf(recvData);
        }

        char * sendData = "一個來自服務端的UDP數據包\n";
        sendto(serSocket, sendData, strlen(sendData), 0, (SOCKADDR*)&remoteAddr, nAddrLen);

    }
    closesocket(serSocket);
    WSACleanup();
    return 0;
}
  • CLIENT端
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>


int main(int argc, char* argv[])
{
    WORD socketVersion = MAKEWORD(2, 2);
    WSADATA wsaData;
    if (WSAStartup(socketVersion, &wsaData) != 0)
    {
        return 0;
    }
    SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8000);
    sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    int len = sizeof(sin);

    char * sendData = "Hello, my friend\n";
    sendto(sclient, sendData, strlen(sendData), 0, (SOCKADDR*)&sin, len);

    char recvData[255];
    int ret = recvfrom(sclient, recvData, 255, 0, (SOCKADDR*)&sin, &len);
    if (ret > 0)
    {
        recvData[ret] = 0x00;
        printf(recvData);
    }

    closesocket(sclient);
    WSACleanup();
    return 0;
}
  • 編譯
gcc server_udp.c -o server_udp -lwsock32
gcc client_udp.c -o client_udp -lwsock32

總結

對于TCP版本的程序來說

server 端:創(chuàng)建WSAStartup -》檢測!=0 -》創(chuàng)建socket -》檢測SOCKET_ERROR -》聲明sockaddr_in結構 -》bind -》檢測SOCKET_ERROR -》listen -》檢測SOCKET_ERROR -》進入循環(huán) -》accept -》檢測SOCKET_ERROR -》接收索守、發(fā)送消息
client 端:創(chuàng)建WSAStartup -》檢測!=0 -》創(chuàng)建socket -》檢測SOCKET_ERROR -》聲明sockaddr_in結構 -》connect -》檢測SOCKET_ERROR -》發(fā)送晕窑、接收消息

對于UDP版本的程序來說

server 端:創(chuàng)建WSAStartup -》檢測!=0 -》創(chuàng)建socket -》檢測SOCKET_ERROR -》聲明sockaddr_in結構 -》bind -》檢測SOCKET_ERROR -》進入循環(huán) -》發(fā)送、接收消息
client 端:創(chuàng)建WSAStartup -》檢測!=0 -》創(chuàng)建socket -》檢測SOCKET_ERROR -》聲明sockaddr_in結構 -》發(fā)送卵佛、接收消息

TCP中杨赤,使用send和recv函數進行發(fā)送和接收消息
UDP中,使用sendto和recvfrom函數進行發(fā)送和接收消息

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末截汪,一起剝皮案震驚了整個濱河市疾牲,隨后出現的幾起案子,更是在濱河造成了極大的恐慌衙解,老刑警劉巖阳柔,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蚓峦,居然都是意外死亡舌剂,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門枫匾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來架诞,“玉大人,你說我怎么就攤上這事干茉。” “怎么了很泊?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵角虫,是天一觀的道長。 經常有香客問我委造,道長戳鹅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任昏兆,我火速辦了婚禮枫虏,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己隶债,他們只是感情好腾它,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著死讹,像睡著了一般瞒滴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赞警,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天妓忍,我揣著相機與錄音,去河邊找鬼愧旦。 笑死世剖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的笤虫。 我是一名探鬼主播旁瘫,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耕皮!你這毒婦竟也來了境蜕?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤凌停,失蹤者是張志新(化名)和其女友劉穎粱年,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體罚拟,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡台诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了赐俗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拉队。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阻逮,靈堂內的尸體忽然破棺而出粱快,到底是詐尸還是另有隱情,我是刑警寧澤叔扼,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布事哭,位于F島的核電站,受9級特大地震影響瓜富,放射性物質發(fā)生泄漏鳍咱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一与柑、第九天 我趴在偏房一處隱蔽的房頂上張望谤辜。 院中可真熱鬧蓄坏,春花似錦、人聲如沸丑念。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渠欺。三九已至妹蔽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挠将,已是汗流浹背胳岂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舔稀,地道東北人乳丰。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像内贮,于是被迫代替她去往敵國和親产园。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容