C语言实现SOCKET通信

#include <WINSOCK2.H>   
#include <stdio.h>     
#pragma comment(lib, "ws2_32.lib")  
#include<graphics.h>
#include<iostream>
#include <conio.h>

using namespace std;
//宏定义信息
#define PORT           8080    //端口号
#define MSGSIZE        1024    //接收数据的缓冲区大小最大值
#define SENDSIZE       4 

int main()
{
    //程序 socket
    WSADATA wsaData;//存储WSAStartup的返回数据 版本信息,制造商标识配置信息等
    SOCKET sListen; //标识套接字的文件描述符
    SOCKET sClient; //accept的返回值它是一个新的套接字描述符,它代表的是和客户端的新的连接
    SOCKADDR_IN local;//包含协议  IP 端口号 三大要素
    SOCKADDR_IN client;//acceptd参数中的的SOCKET包含的是服务器的ip和port信息 。
    char szMessage[MSGSIZE];//接收数据的缓冲区
    char sendM[SENDSIZE];//发送的数组
    int ret;
    int iaddrSize = sizeof(SOCKADDR_IN);

    //向操作系统说明我们要用哪个库文件  使用Socket的程序在使用Socket之前必须调用WSAStartup函数。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
    WSAStartup(0x0202, &wsaData);//可使用的最高版本号(低位主版本号,高位副版本号),指向WSADATA数据类型的指针

    //建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。
    sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//IPv4 Internet协议  流式套接字  Tcp连接  
    //协议  IP 端口号 三大要素
    local.sin_family = AF_INET; //IPv4 Internet协议
    local.sin_port = htons(PORT);//htons:将一个无符号短整型数值转换为网络字节序,即大端模式。   PORT是端口号
    local.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY 转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP
    //bind函数的作用是将套接字绑定一个IP地址和端口号 等即local的几个元素
    bind(sListen, (struct sockaddr*)&local, sizeof(SOCKADDR_IN));//
    //listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程
    listen(sListen, 2);//套接字  等待处理的队列长度
    //当调用listen之后,服务器进程就可以调用accept来接受一个外来的请求  返回值是一个新的套接字描述符,它代表的是和客户端的新的连接 这个socket包含的是客户端的ip和port信息 
    //接收一个套接字中已建立的连接 
    sClient = accept(sListen, (struct sockaddr*)&client, &iaddrSize);//参数中的的SOCKET包含的是服务器的ip和port信息 。
    sendM[0] = '3';
    sendM[1] = '2';
    sendM[2] = '1';
    sendM[3] = '\0';
    send(sClient, sendM, SENDSIZE, 0);
  
    
    while (TRUE) 
    {
        //接收端的套接字描述符   接收数据所在的缓冲区  缓冲区最大尺寸  0   返回值:实际收到的字节数 出错:SOCKET_ERROR 如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
        FD_ZERO(&fd);
        FD_SET(sClient, &fd);
        if (select(sClient + 1, &fd, NULL, NULL, &tiout) != 0)
        {
            ret = recv(sClient, szMessage, MSGSIZE, 0);
            szMessage[2] = '\0';//字符变字符串
            if (ret == 0)//断网重新连接
            {  
                sClient = accept(sListen, (struct sockaddr*)&client, &iaddrSize);//参数中的的SOCKET包含的是服务器的ip和port信息 。
            }
           
               
        }

    }
    return 0;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zx62365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值