基于Udp的Socket網絡編程聊天程序

openkk 12年前發布 | 34K 次閱讀 Socket C/C++開發

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.先運行服務端程序,再運行客戶端程序

可以聊天了,但是只能客戶端發一句,服務端發一句,比較呆板

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!