😎 作者介绍:我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun,视频号:AI-行者Sun 🎈 本文专栏:本文收录于《网络编程实战》系列专栏,相信一份耕耘一份收获,我会手把手教分享网络编程实战内容,届时可以拳打字节,脚踢腾讯 🤓 欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。 🖥 随时欢迎您跟我沟通,一起交流,一起成长、进步!

Socket 编程是一种用于在网络上进行通信的编程方法,以下代码可以实现在不同主机之间传输数据。

Socket 编程中服务器端和客户端的基本步骤:服务器端步骤:

1.创建 Socket:

int serverSocket = socket(AF_INET, SOCK_STREAM, 0);

使用 socket 函数创建一个套接字。AF_INET 表示使用 IPv4 地址族。SOCK_STREAM 表示使用 TCP 协议,如果使用 UDP,则为 SOCK_DGRAM。

2.绑定地址和端口:

struct sockaddr_in serverAddress;

serverAddress.sin_family = AF_INET;

serverAddress.sin_addr.s_addr = INADDR_ANY;

serverAddress.sin_port = htons(PORT);

bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));

初始化服务器地址结构体 sockaddr_in,设置 IP 地址和端口。使用 bind 函数将套接字绑定到指定的地址和端口。

3.监听连接请求:

listen(serverSocket, BACKLOG);

使用 listen 函数开始监听连接请求。BACKLOG 参数指定连接请求队列的最大长度。

4.接受客户端连接:

int clientSocket = accept(serverSocket, NULL, NULL);

使用 accept 函数接受客户端的连接请求。返回一个新的套接字 clientSocket,用于与客户端通信。

5.接收和发送数据: 使用 recv 函数从客户端接收数据,使用 send 函数向客户端发送数据。 关闭连接:

close(clientSocket);

close(serverSocket);

使用 close 函数关闭连接的套接字。

客户端步骤:

1. 创建 Socket:

int clientSocket = socket(AF_INET, SOCK_STREAM, 0);

使用 socket 函数创建一个套接字。设置服务器地址和端口:

struct sockaddr_in serverAddress;

serverAddress.sin_family = AF_INET;

serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP);

serverAddress.sin_port = htons(PORT);

初始化服务器地址结构体 sockaddr_in,设置服务器的 IP 地址和端口。连接到服务器:

connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));

使用 connect 函数连接到服务器。发送和接收数据:使用 send 函数向服务器发送数据,使用 recv 函数从服务器接收数据。关闭连接:

close(clientSocket);

使用 close 函数关闭连接的套接字。

解决分包、粘包问题

Socket实现模拟TCP通信粘包问题-CSDN博客

Client:

#include

#include

#include

#include

#include

#include

int main(){

//1.创建socket

int client_sock=socket(AF_INET,SOCK_STREAM,0);

if (client_sock==-1)

{

std::cerr<<"Faild to create socket"<

return -1;

}

//2.连接服务器

struct sockaddr_in server_addr;

server_addr.sin_family=AF_INET;

//server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);

server_addr.sin_port=htons(9999);

if(connect(client_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1){

std::cerr<<"Faild to connect socket"<

return -1;

}

std::cout<<"Connected to server"<

//3.数据交互

//发送消息

std::string msg="Hello server!\n";

if(write(client_sock,msg.c_str(),msg.length())==-1){

std::cerr<<"Faild to write "<

return -1;

}

//接受消息

char buffer[1024];

if(read(client_sock,buffer,sizeof(buffer))==-1){

std::cerr<<"Faild to read"<

return -1;

}

printf("Receive to server :%s",buffer);

close(client_sock);

}

Server:

#include

#include

#include

#include

#include

#include

int main(int, char**){

//1.创建套接字

int listen_sock=socket(AF_INET,SOCK_STREAM,0);

if (listen_sock==-1)

{

std::cerr<<"Fiald to create socket"<

return 1;

}

//2.绑定IP地址

struct sockaddr_in server_addr;

memset(&server_addr,0,sizeof(server_addr));

server_addr.sin_addr.s_addr=INADDR_ANY;

server_addr.sin_family=AF_INET;

server_addr.sin_port=htons(9999);

if(bind(listen_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1)

{

std::cerr<<"Fiald to bind socket"<

return 1;

}

//3.监听套接字

if (listen(listen_sock,5)==-1)

{

std::cerr<<"Fiald to listen socket"<

return 1;

}

std::cout<<"server is listening"<

//4.接受客户端的连接

struct sockaddr_in client_addr;

socklen_t client_addr_len=sizeof(client_addr);

int client_sock=accept(listen_sock,(struct sockaddr*)&client_addr,&client_addr_len);

if (client_sock==-1)

{

std::cerr<<"Fiald to accept socket"<

return 1;

}

std::cout<<"a client connected"<

//5.数据交互

//接受消息

char buffer[1024];

int read_size=read(client_sock,buffer,sizeof(buffer));

if (read_size==-1)

{

std::cerr<<"Fiald to read"<

return 1;

}

std::cout<<"Received to client :"<

std::string res_msg="Hello Client!";

int wr=write(client_sock,res_msg.c_str(),res_msg.length());

if (wr==-1)

{

std::cerr<<"Fiald to write"<

return 1;

}

close(client_sock);

close(listen_sock);

}

Copyright © 2088 世界杯乒乓球赛_2014世界杯十佳球 - mz286.com All Rights Reserved.
友情链接