基于Udp的Socket网络编程聊天程序

openkk 12年前

1.新建一个工程区Net

在工作区中添加两个工程 NetSrv 和 NetClient

为两个工程添加库文件 (Link中) ws2_32.lib

2.在工程NetSrv中添加Server.cpp文件

代码如下:

#include <WINSOCK2.H>  #include <stdio.h>    void main()  {   WORD wVersionRequested;   WSADATA wsaData;   int err;      wVersionRequested = MAKEWORD( 2, 2 );      err = WSAStartup( wVersionRequested, &wsaData );   if ( err != 0 )   {    return;   }      if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )    {    WSACleanup( );    return;    }      SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);   SOCKADDR_IN addrSrv;   addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);   addrSrv.sin_family = AF_INET;   addrSrv.sin_port = htons(6000);     bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));     char recvBuf[100];   char sendBuf[100];   char tempBuf[200];     SOCKADDR_IN addrClient;   int len = sizeof(SOCKADDR);     while (1)   {    recvfrom(sockSrv , recvBuf, 100, 0, (SOCKADDR*)&addrClient,&len);    if ('q'==recvBuf[0])    {     sendto(sockSrv,"q",strlen("q")+1, 0 , (SOCKADDR*)&addrClient,len);     printf("Chat end!\n");     break;    }    sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf);    printf("%s\n",tempBuf);    printf("Please input data:\n");    gets(sendBuf);    sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);   }   closesocket(sockSrv);   WSACleanup();  }

3.在工程NetClient中添加Client.cpp文件 代码如下:
#include <WINSOCK2.H>  #include <stdio.h>    void main()  {   WORD wVersionRequested;   WSADATA wsaData;   int err;      wVersionRequested = MAKEWORD( 2, 2 );      err = WSAStartup( wVersionRequested, &wsaData );   if ( err != 0 )   {    return;   }      if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 )    {    WSACleanup();    return;    }     SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);      SOCKADDR_IN addrSrv;   addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");   addrSrv.sin_family=AF_INET;   addrSrv.sin_port = htons(6000);     char recvBuf[100];   char sendBuf[100];   char tempBuf[200];     int len = sizeof(SOCKADDR);     while (1)   {    printf("Please input data:\n");    gets(sendBuf);    sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);       recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);    if ('q' == recvBuf[0])    {     sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len);     printf("Chat end!\n");     break;    }    sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf);    printf("%s\n",tempBuf);   }   closesocket(sockClient);   WSACleanup();  }

4.先运行服务端程序,再运行客户端程序

可以聊天了,但是只能客户端发一句,服务端发一句,比较呆板