#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;
}
C语言实现SOCKET通信
最新推荐文章于 2024-04-17 03:11:16 发布