美文网首页
socket编程源码实现

socket编程源码实现

作者: analanxingde | 来源:发表于2018-08-19 21:29 被阅读14次

    之前曾发过一篇关于网络编程过程中函数的简介(https://www.jianshu.com/p/85030f014c98),这篇文章在此基础上添加了具体实现,两篇配合起来有助于加深对网络编程过程理解。

    基于socket编程,基本上就是以下6个步骤:
    1、socket()函数
    2、bind()函数
    3、listen()、connect()函数
    4、accept()函数
    5、read()、write()函数等
    6、close()函数
    本文实现一个简单地socket网络编程的例子:

    server.cpp

    #include <stdio.h>
    #include <winsock2.h>
    #pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll
     
    int main(){
        //初始化 DLL
        WSADATA wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);
     
        //创建套接字
        SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
     
        //绑定套接字
        sockaddr_in sockAddr;
        memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
        sockAddr.sin_family = PF_INET;  //使用IPv4地址
        sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
        sockAddr.sin_port = htons(1234);  //端口
        bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
     
        //进入监听状态
        listen(servSock, 20);
     
        //接收客户端请求
        SOCKADDR clntAddr;
        int nSize = sizeof(SOCKADDR);
        SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
     
        //向客户端发送数据
        const char *str = "Hello World!";
        send(clntSock, str, strlen(str) + sizeof(char), NULL);
     
        //关闭套接字
        closesocket(clntSock);
        closesocket(servSock);
        system("pause");
        //终止 DLL 的使用
        WSACleanup();
     
        return 0;
    }
    

    client.cpp

    #include <stdio.h>
    #include <stdlib.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")  //加载 ws2_32.dll
     
    int main(){
        //初始化DLL
        WSADATA wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);
     
        //创建套接字
        SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
     
        //向服务器发起请求
        sockaddr_in sockAddr;
        memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
        sockAddr.sin_family = PF_INET;
        sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        sockAddr.sin_port = htons(1234);
        connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
     
        //接收服务器传回的数据
        char szBuffer[MAXBYTE] = { 0 };
        recv(sock, szBuffer, MAXBYTE, NULL);
     
        //输出接收到的数据
        printf("Message form server: %s\n", szBuffer);
     
        //关闭套接字
        closesocket(sock);
     
        //终止使用 DLL
        WSACleanup();
     
        system("pause");
        return 0;
    }
    

    分别编译,先运行 server.exe,再运行 client.exe即可
    注意:本文使用的是Dev_C++编译器,需要将编译设置中加入-lwsock32,如下图所示:

    设置支持socket的链接库

    相关文章

      网友评论

          本文标题:socket编程源码实现

          本文链接:https://www.haomeiwen.com/subject/svfhiftx.html