Socket说明
socket也称为“套接字”,用来描述IP地址跟端口,是一个通信链的句柄,通过socket来发送网络请求以及接收网络请求。
通信流程图
服务器代码
#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll动态库
#define RECVSIZE 2048
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 ); //(1<<8|1) 1.1版本
err = WSAStartup( wVersionRequested, &wsaData ); //初始化dll
if ( err != 0 )
{
printf("加载套接字失败");
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return 0;
}
/************************************************************************/
/* 参数1:协议族,规定了socket的地址类型,AF_INET为IPV4地址
** 参数2:套接字类型,SOCK_STREAM为流式套接字
** 参数3:指定协议,为0自动选择参数2的默认协议*/
/************************************************************************/
SOCKET sockSer = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSer;
addrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY指定地址为0.0.0.0的地址,其实为不确定的地址
addrSer.sin_family=AF_INET;
addrSer.sin_port=htons(80);
int retVal = bind(sockSer,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));// 绑定端口
if(retVal == SOCKET_ERROR){
printf("Failed bind:%d\n", WSAGetLastError());
return 1;
}
if(listen(sockSer,10) ==SOCKET_ERROR){
printf("Listen failed:%d", WSAGetLastError());
return 1;
}
SOCKADDR_IN addrClient;// 连接上的客户端ip地址
int len=sizeof(SOCKADDR);
char recvbuf[RECVSIZE]={0};
while(1)
{
printf("start ...\n");
SOCKET sockConn=accept(sockSer,(SOCKADDR*)&addrClient,&len);// 接受客户端连接,获取客户端的ip地址
if(sockConn)
{
printf("Client:%s---->port%d connect!\r\n",inet_ntoa(addrClient.sin_addr),ntohs(addrClient.sin_port));
}
// 接受客户端消息
int recvlen=recv(sockConn,recvbuf,RECVSIZE,0);
printf("recvlen = %d\r\n",recvlen);
if(recvlen!=0)
{
FILE *fd=fopen("\idcard.txt","w+");
printf("create file\n");
int wrtLen = fwrite(recvbuf,recvlen,1,fd);
printf("write file\n");
fclose(fd);
}
}
WSACleanup();
return 0;
}