纯C下Windows Socket编程之TCP

这篇博客详细介绍了如何在Windows环境下使用C语言进行TCP Socket编程,包括服务端和客户端的步骤,从初始化socket环境到创建socket,再到数据的发送和接收,以及最后的关闭连接。服务端通过多线程技术可以同时处理多个客户端连接。
摘要由CSDN通过智能技术生成

C 语言Windows socket编程笔记

最近学习了如何在Windows平台下使用c语言进行socket编程,理了下思绪,笔记如下。

语言标准:c99

编译器    :gcc 

Part1:TCP

1.使用socket通信过程

建立socket。

将socket绑定到一本地地址。

服务端:

  • 监听是否有连接请求
  • 接受一个连接请求同时保存客户端信息(建立连接)
  • 接受客户端数据 或 向客户端发送发送数据(单次或重复此过程)
  • 关闭客户端连接(可选)

客户端:

  • 获取服务器地址
  • 向服务器发起建立连接请求(程序停下直到连接成功或失败)
  • 向服务器发送数据或接受服务器发来的数据(单次或重复此过程)
  • 关闭同服务器的连接(可选)

如果是在Windows平台下,先初始化socket环境。

2.函数说明

ps:所需头文件             #include <winsock2.h>

服务端

<1>  socket环境初始化

WSADATA wsaData;//1.启动SOCKET库,版本为2.2
    int errcode = WSAStartup(MAKEWORD(2,2),&wsaData);
    if(errcode != 0)
    {
        puts("Wsastartup error");
        return 0;
    }
    if (LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )//检查Socket库的版本是否为2.2
    {
       WSACleanup();
       puts("Version error");
       return 0;
    }
WSAStartup说明

<2> 创建socket

sock_ser = socket(PF_INET,SOCK_STREAM,0);
    if(sock_ser == INVALID_SOCKET)
    {
        puts("sock_ser error");
        return 0;
    }

 

百科解释:

socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。如果协议protocol未指定(等于0),则使用缺省的连接方式。

int socket( int af, int type, int protocol);
af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。
type:指定socket类型。新套接口的类型描述类型,如TCP(SOCK_STREAM)和UDP(SOCK_DGRAM)。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。
protocol:顾名思义,就是指定协议。 套接口所用的协议。如调用者不想指定,可用0。常用的协议有,IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。       
 

注:PF_INET 与 AF_INET 值相同,但所代表含义不同。socket变量所存储的数据就是一个int类型的值。标志着这个socket的 “号码” ,这个号码是由操作系统负责分配的。

<3> 设置服务端本地ip并绑定

SOCKADDR_IN 结构说明(来自百度)

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

typedef struct sockaddr_in SOCKADDR_IN;

typedef struct in_addr
{
    union{
            struct { unsigned char s_b1,s_b2,s_b3,s_b4; } S_un_b;
            struct { unsigned short s_w1,s_w2; } S_un_w;
            unsigned long S_addr;
    }S_un;
}in_addr;

 

sin_family指代协议族
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值