码迷,mamicode.com
首页 > 其他好文 > 详细

Socket网络聊天程序

时间:2019-12-20 15:16:08      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:DRC   bre   sdn   start   socket   and   ||   tps   要求   

 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("已经退出聊天!\n");
                        continue;
                    }
                    printf("%s\n", recvBuf);
                }

        }
        return 0;
}
void main()
{
    printf("服务器开启!\n");
    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网络聊天程序

标签:DRC   bre   sdn   start   socket   and   ||   tps   要求   

原文地址:https://www.cnblogs.com/tangdingkang/p/12073144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!