Windows平台下相比Linux平台下基于UDP协议的客户端和服务端的编写,只是多了一个引入WS2_32..lib库和
WSADATA数据初始化的过程。下面的代码利用UDP协议实现一个简单客户端和服务器聊天的功能,由于非常简单代码不再详细进行介绍。
客户端代码:
Github位置:
服务器端代码:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<winsock2.h>
#define BUF_SIZE 30
void error_handling(char* message);
int main(int argc,char* argv[])
{
WSADATA wsaData;
SOCKET servSock;
char message[BUF_SIZE];
int strLen;
int clntAdrSz;
SOCKADDR_IN servAdr,clntAdr;
if(argc!=2)
{
printf("Usage %s <Port>",argv[0]);
exit(1);
}
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
error_handling("WSASatrt() error");
servSock=socket(PF_INET,SOCK_DGRAM,0);
if(servSock==INVALID_SOCKET)
{
error_handling("udp socket createtion error");
}
memset(&servAdr,0,sizeof(servAdr));
servAdr.sin_family=AF_INET;
servAdr.sin_addr.s_addr=htonl(INADDR_ANY);
servAdr.sin_port=htons(atoi(argv[1]));
if(bind(servSock,(SOCKADDR*)&servAdr,sizeof(servAdr))==SOCKET_ERROR)
{
error_handling("bind error");
}
while(1)
{
memset(message,0,BUF_SIZE);
clntAdrSz=sizeof(clntAdr);
strLen=recvfrom(servSock,message,BUF_SIZE-1,0,
(SOCKADDR*)&clntAdr,&clntAdrSz);
message[strLen]=0;
printf("client: %s",message);
memset(message,0,BUF_SIZE);
fputs("server: ",stdout);
fgets(message,BUF_SIZE,stdin);
sendto(servSock,message,strlen(message),0,
(SOCKADDR*)&clntAdr,sizeof(clntAdr));
}
closesocket(servSock);
WSACleanup();
return 0;
}
void error_handling(char* message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
客户端代码:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<winsock2.h>
#define BUF_SIZE 30
void error_handling(char* message);
int main(int argc,char* argv[])
{
WSADATA wsaData;
SOCKET servSock;
SOCKADDR_IN servAdr;
char message[BUF_SIZE]="hello world\n";
int strLen;
if(argc!=3)
{
printf("Usage %s <ip> <port>",argv[0]);
exit(1);
}
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
error_handling("WSASatrtup error");
}
servSock=socket(PF_INET,SOCK_DGRAM,0);
if(servSock==INVALID_SOCKET)
{
error_handling("socket error");
}
memset(&servAdr,0,sizeof(servAdr));
servAdr.sin_family=AF_INET;
servAdr.sin_addr.s_addr=inet_addr(argv[1]);
servAdr.sin_port=htons(atoi(argv[2]));
connect(servSock,(SOCKADDR*)&servAdr,sizeof(servAdr));
while(1)
{
memset(message,0,BUF_SIZE);
fputs("client(q to quit): ",stdout);
fgets(message,BUF_SIZE,stdin);
if(!strcmp(message,"q")||!strcmp(message,"Q\n"))
{
break;
}
send(servSock,message,strlen(message),0);
memset(message,0,BUF_SIZE);
strLen=recv(servSock,message,BUF_SIZE-1,0);
message[strLen]=0;
printf("server: %s\n",message);
}
closesocket(servSock);
WSACleanup();
return 0;
}
void error_handling(char* message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL06