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语言基于socket-实现客户端-服务端通信全部内容,希望文章能够帮你解决C语言基于socket-实现客户端-服务端通信所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)