计算机网络 socket编程实现服务器端与客户端连接
服务器端
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
printf("fail");
return -1;
}
SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN serverAddr; //声明一个SOCKADDR_IN变量,表示服务器
serverAddr.sin_family = AF_INET; //必须和创建socket的IP协议一致
serverAddr.sin_port=htons(8888); // //服务器端口,客户端通过这个端口连接
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); //ip用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址
if(SOCKET_ERROR == bind(serverSocket , (SOCKADDR*)&serverAddr , sizeof(serverAddr))) //绑定
{
printf("绑定失败\n");
closesocket(serverSocket); //释放socket
WSACleanup(); //关闭套接字
return -1;
}
printf("绑定成功\n");
listen(serverSocket, 10);//置socket为被动方式
//等待客户连接
SOCKADDR_IN clientAddr;
int len = sizeof(clientAddr);
//接受连接
SOCKET clientSocket = accept(serverSocket,(SOCKADDR*)&clientAddr, &len); //阻塞函数
if(clientSocket == INVALID_SOCKET)
{
printf("连接失败");
closesocket(serverSocket); //释放socket
WSACleanup(); //关闭套接字
return -1 ;
}
printf("连接成功\n");
printf("客户端地址为: %s\n" , inet_ntoa(clientAddr.sin_addr));
char recvBuff[128] = {};
//开始通讯
while(1)
{
memset(recvBuff, 0 , sizeof(recvBuff)); //初始化recvBuff
if(recv(clientSocket , recvBuff, sizeof(recvBuff)-1 , 0) >0) //阻塞函数
{
printf("我是服务器,我收到客户端的信息为: %s\n" , recvBuff);
}
else printf("我是服务器,未收到客户端信息");
if(strcmp(recvBuff,"exit")==0) break; //客户端发送exit时,结束通信
char sendBuff[128] = {};
memset(sendBuff, 0 , sizeof(sendBuff)); //初始化sendBuff
printf("\n服务器准备向客户端发送信息......\n");
printf("请输入要发送的信息:\n");
scanf("%s" , sendBuff);
if(strcmp(sendBuff,"exit")==0) break; //服务器发送exit时结束通信
//一次收发
send(clientSocket , sendBuff, strlen(sendBuff), 0);
}
//关闭socket
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 0;
}
客户端
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
printf("请求版本失败");
return -1;
}
SOCKET clientSocket= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == clientSocket)
{
printf("套接字创建失败");
return -1;
}
SOCKADDR_IN clientAddr; //初始化协议地址
clientAddr.sin_family = AF_INET;//必须和创建socket的IP协议一致
clientAddr.sin_port = htons(8888); //服务器端口,客户端通过这个端口连接
//ip地址是点分格式的字符串 , 用inet_addr来转换整数
clientAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
if( connect(clientSocket , (SOCKADDR *)&clientAddr , sizeof(clientAddr))<0)
{
printf("连接失败");
closesocket(clientSocket); //释放socket
WSACleanup(); //关闭套接字
return -1 ;
}
printf("连接成功\n\n");
char sendBuff[128] = {};
//开始通讯
while(1)
{
memset(sendBuff, 0 , sizeof(sendBuff)); //初始化sendBuff
printf("请输入客户端向服务器发送的信息:\n");
scanf("%s" , sendBuff);
//一次收发
send(clientSocket , sendBuff, strlen(sendBuff), 0);
char recvBuff[128] = {};
memset(recvBuff, 0 , sizeof(recvBuff)); //初始化recvBuff
if(recv(clientSocket , recvBuff, sizeof(recvBuff)-1 , 0) >0) //阻塞函数
{
printf("我是客户端,收到的服务器信息为:%s\n" , recvBuff);
}
else printf("客户端未收到服务器信息");
}
return 0;
}
使用cmd运行即可
版权声明:本文为qq_44885161原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。