Socket网络聊天程序

Posted tangdingkang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket网络聊天程序相关的知识,希望对你有一定的参考价值。

 IDE:CodeBlocks  

(如果在CB下进行Sokcet编程,要添加一个文件)详情请看这个:https://www.cnblogs.com/Xbert/p/5466963.html

然后这个程序是要同时开启客户端和服务端两个,调试很麻烦,建议双开两个codeblocks,链接:https://blog.csdn.net/weixin_41505011/article/details/80575522

客户端代码:

这里开启了一个新线程来接受用户端传来的消息,主线程则可以输出消息

 

#include <stdio.h>
#include <stdlib.h>
#include <Winsock2.h>
char recvBuf[50];
SOCKET sockSrv;
SOCKET sockConn;
DWORD WINAPI Server_Receive_Thread(LPVOID lp)
{
    int i;
    SOCKET s = (SOCKET)lp;
        while(1){     //之前在这里犯错了,线程也是要循环的,不能用if
                if(recv(s, recvBuf, 50, 0)>0){
                    for(i=0;;i++){
                        if(recvBuf[i]==‘]‘)
                            break;
                    }
                    if(recvBuf[i+2]==‘q‘)
                    if(recvBuf[i+3]==‘u‘)
                    if(recvBuf[i+4]==‘i‘)
                    if(recvBuf[i+5]==‘t‘){
                        for(int j=0;j<=i;j++)
                            printf("%c",recvBuf[j]);
                        printf("已经退出聊天!
");
                        continue;
                    }
                    printf("%s
", recvBuf);
                }

        }
        return 0;
}
void main()
{
    printf("服务器开启!
");
    WORD wVersionRequested;             //要求使用winSock的版本
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 1, 1 );
    err = WSAStartup( wVersionRequested, &wsaData );   //初始化winSock
    if ( err != 0 )
    {
        return;
    }
    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
    {
        WSACleanup( );      //版本不对,即退出
        return;
    }
    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);  //创建一个套接字,
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //就是要用来通讯的 IP 地址信息。
    addrSrv.sin_family=AF_INET;                     //这是告诉 WinSock 使用的是 IP 地址族
    addrSrv.sin_port=htons(6000);                   //sin_port 就是要用来通讯的端口号
    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

    SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);
    while(1)
    {
        listen(sockSrv,5);
        //客户端有了连接请求,来用这个函数来接受请求
        SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
        //创建接受消息的线程
        HANDLE hThread = CreateThread(NULL, 0, Server_Receive_Thread, sockConn, 0, NULL);
        char sendBuf[50];
        sprintf(sendBuf,"您的ip地址是:%s ",inet_ntoa(addrClient.sin_addr));
        send(sockConn,sendBuf,strlen(sendBuf)+1,0);
        char message[50];
        while(1){
                scanf("%s",message);
                sprintf(sendBuf,"[Server]:%s ",message);
                send(sockConn,sendBuf,sizeof(sendBuf),0);
                if(strcmp(message,"quit")==0)
                    exit(0);
        }
        closesocket(sockConn);
    }
}

以上是关于Socket网络聊天程序的主要内容,如果未能解决你的问题,请参考以下文章

用socket写一个简单的聊天程序

网络文件传输 使用Socket传输文件 服务器代码 程序初始化

在已经在wampserver上运行的网站上运行socket.io聊天应用程序

聊天应用程序 - Socket.IO/Angular/MongoDB - 聊天和聊天历史不显示

java TCP做聊天程序是应该一个聊天窗口一个线程还是一个Socket一个线程

socket通信流程和一个简单的网络通信程序