通过udp实现一个聊天室。
只需要1个服务器 ,可以支持n个client。
服务器的工作就是接收到消息并转发给其他客户端。客户端需要同时开启接收了发送线程,时时刻刻接收服务器发来的信息以及将自己的信息发送到服务器上。
server:
#include<WinSock2.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma comment(lib,"ws2_32.lib")
#define DEFAULT_PORT 5051//FOR RECV
#define DEFAULT_PORTSEND 5052//FOR SEND
#define BUFFER_LENGTH 1000
typedef struct
{
char ip[20];
char name[10];
bool in;
}CLIENT;
CLIENT clic[1000];
int ci=-1;
void main()
{
int iPort=DEFAULT_PORT;
WSADATA wsaData;
SOCKET sSocket;
int iLen;
int iSend;
int iRecv;
char send_buf[1000];
char recv_buf[BUFFER_LENGTH];
struct sockaddr_in ser,cli;
printf("----------------------\n");
printf("Server Waiting\n");
printf("----------------------\n");
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{printf("Failed to load Winsock.\n");return;}
sSocket=socket(AF_INET,SOCK_DGRAM,0);
if(sSocket==INVALID_SOCKET){printf("socket()Faild:%d\n",WSAGetLastError());return;}
ser.sin_family=AF_INET;
ser.sin_port=htons(iPort);
ser.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR)
{printf("bind()Faild:%d\n",WSAGetLastError());return;}
iLen=sizeof(cli);
memset(recv_buf,0,sizeof(recv_buf));
while(1)
{
//接收数据包 确定cli 表示 cli存有客户端发来的 ip和port
iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);
if(iRecv==SOCKET_ERROR)
{printf("recvfrom()Faild