Comunicación de red de socket bajo Windows

Descripción del enchufe

El socket también se llama "socket", que se usa para describir la dirección IP y el puerto. Es el mango de una cadena de comunicación. El socket se usa para enviar y recibir solicitudes de red.

Diagrama de flujo de comunicación

Escriba la descripción de la imagen aquí

Código del servidor

#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll动态库
#define RECVSIZE 2048

int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1 ); //(1<<8|1)  1.1版本

    err = WSAStartup( wVersionRequested, &wsaData ); //初始化dll
    if ( err != 0 ) 
    {
        printf("加载套接字失败");
        return 0;
    }

    if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) 
    {
        WSACleanup( );
        return 0;
    }

    /************************************************************************/
    /* 参数1:协议族,规定了socket的地址类型,AF_INET为IPV4地址
    ** 参数2:套接字类型,SOCK_STREAM为流式套接字
    ** 参数3:指定协议,为0自动选择参数2的默认协议*/
    /************************************************************************/
    SOCKET sockSer = socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN addrSer;
    addrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY指定地址为0.0.0.0的地址,其实为不确定的地址
    addrSer.sin_family=AF_INET;
    addrSer.sin_port=htons(80);

    int retVal = bind(sockSer,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));// 绑定端口
    if(retVal == SOCKET_ERROR){  
        printf("Failed bind:%d\n", WSAGetLastError());  
        return 1;  
    } 
    if(listen(sockSer,10) ==SOCKET_ERROR){  
        printf("Listen failed:%d", WSAGetLastError());  
        return 1;  
    } 

    SOCKADDR_IN addrClient;// 连接上的客户端ip地址
    int len=sizeof(SOCKADDR);
    char recvbuf[RECVSIZE]={
   
   0};
    while(1)
    {
        printf("start ...\n");
        SOCKET sockConn=accept(sockSer,(SOCKADDR*)&addrClient,&len);// 接受客户端连接,获取客户端的ip地址
        if(sockConn) 
        {
            printf("Client:%s---->port%d connect!\r\n",inet_ntoa(addrClient.sin_addr),ntohs(addrClient.sin_port));
        }
        // 接受客户端消息    
        int recvlen=recv(sockConn,recvbuf,RECVSIZE,0);
        printf("recvlen = %d\r\n",recvlen);
        if(recvlen!=0)
        {
            FILE *fd=fopen("\idcard.txt","w+");
            printf("create file\n");
            int wrtLen  = fwrite(recvbuf,recvlen,1,fd);
            printf("write file\n");
            fclose(fd);
        }
    }
    WSACleanup();  
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/sxtdzj/article/details/80842833
Recomendado
Clasificación