C语言基于socket-实现客户端-服务端通信

前端之家收集整理的这篇文章主要介绍了C语言基于socket-实现客户端-服务端通信前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

C语言基于socket-实现客户端-服务端通信

关于socket不多赘述,博主上一篇做过简单介绍,详情请自行百度查询,本次主要做的是基于socket通信的C语言实现

需要使用的头文件


winsock2.h


操作平台Windows,使用编译器dev(报错缺的文件文章末尾的补充)

winsock2中数据结构及调用简单说明:


socket的创建使用SOCKET,


socket的的地址空间创建采用socketaddr_in


bind()服务端用来绑定端口


listen()侦听模式


accept()接受服务


send()发送数据


recv()接收数据


connect()客户端连接服务器

socketaddr_in的数据结构如下:

/*struct sockaddr

{

//地址族,2字节

unsigned short sa_family;

//存放地址和端口,14字节

char S_un.S_addr[14];

}

struct sockaddr_in

{

//地址族

short int sin_family;

//端口号(使用网络字节序)

unsigned short int sin_port;

//地址

struct in_addr sin_addr;

}

*/

该数据winsock2,已经定义好无需二次定义,博主给出仅供参考方便编程理解。

服务端代码实现

#include

#include

#include

#pragma comment(lib,"ws2_32.lib")

int main(int argc,char* argv[])

{

//初始化

WSADATA wsa_data;

if(WSAStartup(0x202,&wsa_data)!=0)

{

return 0;

}

//创建套接

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

if(server_listen == INVALID_SOCKET)

{

printf("socket error !");

return 0;

}

//绑定IP和端口

sockaddr_in server_socket;

server_socket.sin_family = AF_INET;

server_socket.sin_port = htons(8888);

server_socket.sin_addr.S_un.S_addr = INADDR_ANY;

if(bind(server_listen,(LPSOCKADDR)&server_socket,sizeof(server_socket)) == SOCKET_ERROR)

{

printf("bind error !");

}

//开始监听

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

{

printf("listen error !");

}

//创建客户端套接

SOCKET client_socket;

sockaddr_in client_addr;

int client_addr_len = sizeof(client_addr);

char rev_data[255];

//循环接收数据

while (true)

{

printf("nWait connect...n");

client_socket = accept(server_listen,(SOCKADDR *)&client_addr,&client_addr_len);

if(client_socket == INVALID_SOCKET)

{

printf("accept error !");

continue;

}

printf("nClient IP: %sn",inet_ntoa(client_addr.sin_addr));

//接收数据

int ret = recv(client_socket,rev_data,255,0);

if(ret)

{

rev_data[ret] = '';

printf(rev_data);

}

//回送数据

const char * send_data = "Hello! TCP_CLIENT!n";

send(client_socket,send_data,strlen(send_data),0);

//关闭套接

closesocket(client_socket);

}

//关闭侦听套接

closesocket(server_listen);

//关闭初始化服务

WSACleanup();

return 0;

}

4.客户端代码实现

#include

#include

#include

#pragma comment(lib,&wsa_data)!=0)

{

return 0;

}

//创建套接

SOCKET client_socket = socket(AF_INET,IPPROTO_TCP);

if(client_socket == INVALID_SOCKET)

{

printf("socket error !");

return 0;

}

//绑定IP和端口

sockaddr_in server_socket;

server_socket.sin_family = AF_INET;

server_socket.sin_port = htons(8888);

server_socket.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

if(connect(client_socket,sizeof(server_socket)) == SOCKET_ERROR)

{

printf("conect error !");

return 1;

}

printf("connect suceessfullyn");

char send_buff[255];

char rec_buff[255];

while(true)

{

printf("input message:");

scanf("%s",send_buff);

send(client_socket,send_buff,sizeof(send_buff),0);

if (strcmp(send_buff,"exit")==0) break;

rec_buff[0] = '';

int data_len = recv(client_socket,rec_buff,0);

rec_buff[data_len]='';

printf("n%sn",rec_buff);

}

closesocket(client_socket);

WSACleanup();

return 0;

}

补充

dev直接运行会报错


需要手动添加配置文件


“工具”–>“编译选项”–>“编译器”–>添加“-lwsock32”–>勾选,保存

标题

效果演示



附上编译器生成的exe,需要的留邮箱。

猜你在找的C#相关文章