#pragma comment(lib,"ws2_32.lib")//windows套接字动态链接库
#include <stdio.h>
#include <stdlib.h>
#include <Winsock2.h>//windows套接字头文件
void main(void)
{
WSADATA wsaData;//WSAStartup函数调用后返回的Windows Sockets数据
SOCKET ListeningSocket;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr;//服务端地址
SOCKADDR_IN ClientAddr;
int ClientAddrLen;//客户端地址长度
int Port = 5150;
int Ret;
char DataBuffer[1024];//缓存接收到的信息
if((Ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)//wsastartup()主要就是进行相应的socket库绑定
{
/*makeword是将两个byte型合并成一个word型,一个在高8位(b),一个在低8位(a), 比如a=2;b=1
2的二进制是00000010 1的二进制为00000001 B是表示高8位,A表示低8位 合并起来就是
100000010
MAKEWORD(1,1)和MAKEWORD(2,2)的区别在于,前者只能一次接收一次,不能马上发送,而后者能。*/
printf("WSAStartup failed with error %d\n",Ret);
return ;
}
if((ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)//无效套接字
{
printf("WSAStartup failed with error %d\n",Ret);
return ;
}
ServerAddr.sin_family = AF_INET;//IPV4
ServerAddr.sin_port = htons(Port);//从主机字节顺序转变成网络字节顺序,地址空间存储方式变为高位字节存放在内存的低地址处,大端。
ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//将主机数转换成无符号 长整型 的网络字节顺序
if(bind(ListeningSocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
/*bind函数把一个本地协议地址赋予一个套接字.
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);*/
printf("bind failed with error %d\n",WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return ;
}
if(listen(ListeningSocket,5)==SOCKET_ERROR)//最多支持5个客户端同时连接
{
printf("bind failed with error %d\n",WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return ;
}
printf("we are waiting a connecting on port %d.\n",Port);
ClientAddrLen = sizeof(SOCKADDR);
if((NewConnection = accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET)
{
printf("accept failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return ;
}
printf("we successfully got a connection from %s:%d\n", inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));
//将一个网络字节序的IP地址(也就是结构体in_addr类型变量)转化为点分十进制的IP地址(字符串)
closesocket(ListeningSocket);
if((Ret = recv(NewConnection,DataBuffer, sizeof(DataBuffer),0)) == SOCKET_ERROR)
{
printf("recv failed with error %d\n", WSAGetLastError());
closesocket(NewConnection);
WSACleanup();
return;
}
printf("we successfully received %d bytes. \n", Ret);
DataBuffer[Ret] = '\0';
printf("%s\n", DataBuffer);
closesocket(NewConnection);
WSACleanup();
system("pause");
}
TCP套接字服务端
猜你喜欢
转载自blog.csdn.net/qq_42250189/article/details/104488894
今日推荐
周排行