基于TCP/IP协议的C++网络编程(API函数版)

本文详细介绍了基于TCP/IP协议的网络编程过程,包括初始化、创建套接字、绑定地址、监听、接受连接、收发通信及关闭操作。通过具体代码示例展示了服务器端和客户端的实现流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源代码:http://download.youkuaiyun.com/detail/nuptboyzhb/4169959

基于TCP/IP协议的网络编程

定义变量——获得WINSOCK版本——加载WINSOCK——初始化——创建套接字 ——设置套接字选项——关闭套接字——卸载WINSOCK——释放所有资源

整个程序架构分为两大部分,服务器端客户端。

服务器SOCKET程序流程:

socket()→bind()→listen→accept()→recv()/send()→closesocket()

客户端:

socket→bind()→connect()→send()/recv()→closesocket()

编程举例:

约定发送消息的格式为如下结构体:

typedef struct

{

int ID;

char data[255];

}TcpMessage;

应用程序的头文件如下:

#include <winsock2.h>

#pragma comment(lib,"ws2_32")

#include <stdio.h>

端口号为:4500

服务器端:

1、 初始化:

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 2);

if(WSAStartup(sockVersion, &wsaData) != 0)

return 0;

2、 创建套接字:

SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sListen == INVALID_SOCKET)

{

printf("socket error\n");

return 0;

}

3、 使套接字和本地地址绑定

// sockaddr_in结构中装入地址信息

sockaddr_in sin;

sin.sin_family = AF_INET;

sin.sin_port = htons(4500); // htons函数将主机的无符号短整形数转换成网络

//字节顺序

sin.sin_addr.S_un.S_addr = INADDR_ANY;

if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

{

printf(" bind error \n");

closesocket(sListen);

return 0;

}

4、监听端口

if(listen(sListen, 5) == SOCKET_ERROR)

{

printf("listen error\n");

closesocket(sListen);

return 0;

}

5、等待接受连接,(如无连接,一直等待)

SOCKET sClient;//用于保存accept返回的套接字

sClient = accept(sListen,0,0);//accept函数调用失败则继续等待连接。

if(sClient == INVALID_SOCKET)

{

printf("accept() error");

}

6、用第5步中accept函数返回的套接字进行收发通信

6.1、接收:(如果没有接到,会等待!

TcpMessagerevData;//定义接收消息的结构体变量

int ret=recv(sClient,(char *)&revData,sizeof(revData),0);

if(ret>0)//说明,收到字节

{

switch (revData.ID)//对不同的ID,可以有不同的反应

{

case 1:

……..

case 2:

……..

}

}

6.2、发送:

TcpMessage sendData;

memset((char*)&sendData,0,sizeof(sendData));//初始化为0

sendData.ID=1;//ID成员变量赋值

strcpy(sendData.data,"\r\n..要发送的字符信息 ");

if(send(sClient,(char*)&sendData,sizeof(sendData),0)==SOCKET_ERROR)

{

char error[10];

int errorcode=WSAGetLastError();

itoa(errorcode,error,10);

MessageBox(NULL,error,"发送失败,错误码为:",MB_OK);

printf("send error!");

}

7、关闭

closesocket(sClient);//accept生成的套接字

closesocket(sListen);//服务端套接字

WSACleanup();

客户端

1、 初始化

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 2);

if(WSAStartup(sockVersion, &wsaData) != 0)

return 0;

2、 创建套接字

SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sClient == INVALID_SOCKET)

{

printf("socket error\n");

return 0;

}

3、 使套接字和本地地址绑定

// sockaddr_in结构中装入服务器端地址信息

sockaddr_in servAddr;

servAddr.sin_family = AF_INET;

servAddr.sin_port = htons(4500);// htons函数将主机的无符号短整形数转换成网络

//字节顺序,4500端口为要连接服务器端的端口

servAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");//服务器端ip

4、 连接服务器

if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)

{

printf("connect error\n");

closesocket(sClient);

return 0;

}

//注意,要先把服务器打开,否则连接失败

5、 收发通信

sendrecv函数,这一点和服务器端一样

6、 关闭

closesocket(sClient);//客户端只有一个连接套接字

WSACleanup();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值