#include<WINSOCK2.H>
#include<stdio.h>
#pragma comment(lib,"ws2_32")//#pragma comment( comment-type ,["commentstring"] ) , comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。 , commentstring是一个提供为comment-type提供附加信息的字符串。
//静态加入一个lib文件也就是库文件ws2_32.lib文件,提供相关API的支持,否则需要动态载入ws2_32.dll。
#define SERVER_PORT 6000
#define MAXBUFLEN 1024
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1,1);//返回版本号
if(WSAStartup(wVersionRequested,&wsaData)!=0)//启动Windows socket ,0 表示成功
{
return -1;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)//LOWORD()得到一个32bit数的低16bit HIWORD()得到一个32bit数的高16bit LOBYTE()得到一个16bit数最低(最右边)那个字节 HIBYTE()得到一个16bit数最高(最左边)那个字节
{
WSACleanup();// 终止Winsock 2 DLL (Ws2_32.dll) 的使用.
return -1;
}
SOCKET sockSrv;
if((sockSrv = socket(AF_INET,SOCK_DGRAM,0))==-1)//int socket(int domain, int type, int protocol); 协议族 AF_INET代表ipv4 socket 类型 协议
{
perror("socket");//将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串
WSACleanup();
return -1;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //sin_addr是一个联合体,用联合体就可以使用多种方式表示IP地址.一般我们使用其中的最后一种方式,即用无符号长整型数据来表示IP地址.此时,用的是s_nu数据成员,s_un是一个结构体,其中只有一个数据成员,即s_addr.
//htonl 本函数将一个32位数从主机字节顺序转换成网络字节顺序。
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(SERVER_PORT);
if(bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==-1) //int PASCAL FAR bind( SOCKET sockaddr, const struct sockaddr FAR* my_addr,int addrlen); 0 成功 -1 失败
{
perror("bind");
return -1;
}
else
printf("Server started,listening at port %d\n\n",SERVER_PORT);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvBuf[MAXBUFLEN] = {0};
while(1)
{
if(recvfrom(sockSrv,recvBuf,MAXBUFLEN,0,(SOCKADDR*)&addrClient,&len)==-1)
{
perror("recvfrom");
break;
}
printf("Client: %s\n",recvBuf);
if(stricmp(recvBuf,"quit")==0)
strcpy(recvBuf,"Bye");
else
strcpy(recvBuf,"GET");
printf("Server: %s\n",recvBuf);
if(sendto(sockSrv,recvBuf,strlen(recvBuf)+1,0,(SOCKADDR*)&addrClient,len)==-1)
{
perror("sendto");
break;
}
if(stricmp(recvBuf,"Bye")==0)
break;
}
closesocket(sockSrv);
WSACleanup();
return 0;
}
Windows socket 通信
最新推荐文章于 2023-08-17 13:35:27 发布