Socket编程实现多人聊天室(C语言版)

本文介绍了如何使用C语言通过Socket编程实现一个多人聊天室。客户端通过创建数据接收和发送线程与服务器交互,服务器端则通过套接字数组和多线程进行连接管理和数据转发。代码中包含了详细思路和注释,适合初学者。然而,当前程序在客户端断开连接时存在错误,建议为每个客户端连接创建单独的线程进行状态检测并及时关闭。
摘要由CSDN通过智能技术生成

       socket编程花了我三四天的事件终于将这个程序给实现了大笑大笑

      所谓的多人聊天室,其实不过是客户端创建一个数据接收线程和数据发送线程,而在服务器端创建一个套接字数组,开启一个接受连接请求线程,不断接受来自客户端的连接请求,然后将建立的连接所形成的新套接字描述符存进套接字数组,并针对所存储的套接字描述符建立多个数据接收线程,对于所接收到的数据,开启一个数据转发进程,对套接字数组中的每个客户端将收到的数据进行转发。服务器就是起到这个一个数据转发的功能。

附上代码

客户端:

#include <stdio.h>
#include <winsock2.h>
#include <pthread.h>
#pragma comment(lib,"ws2_32.lib")
char buffer[4096] = {0};
int iRecvLen = 0;
int iSnedLen = 0;
char name[20];
void  THRE_RECV(SOCKET ClientSocket)
{
    char buffer[50]={0};
    while(1)
    {
        memset(buffer, 0, sizeof(buffer));///接收消息

        iRecvLen = recv(ClientSocket, buffer, sizeof(buffer), 0);
        if (SOCKET_ERROR == iRecvLen)
        {
            printf("send failed with error code: %d\n", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
            return -1;
        }
        ///printf("recv %d bytes from %s: ", iRecvLen, nameOther);//为了美观最好不要打印这个了
        //strcat(buffer, "\0");
        buffer[iRecvLen] = 0;
        printf("\n%s\n", buffer);
    }
}

int main()
{
     WSADATA wsaData = { 0 };///存放套接字信息,WSADATA结构被用来保存AfxSocketInit函数返回的WindowsSockets初始化信息。
    SOCKET ClientSocket = INVALID_SOCKET;///客户端套接字
    ///printf("%d\n",INVALID_SOCKET);
    SOCKADDR_IN ServerAddr = { 0 };///服务端地址
    USHORT uPort = 18000;///服务端端口

    ///初始化套接字
    if(WSAStartup(MAKEWORD(2,2), &wsaData))///该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本
    ///第二个参数返回请求的socket版本信息
    {
        printf("WSAStartup failed with error code: %d\n", WSAGetLastError());
        return -1;
    }
    ///判断套接字版本
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("wVersion was not 2.2\n");
        return -1;
    }
    ///创建套接字
    ClientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);///AF_INET代表一个地址族,SOCK_STREAM表示为TCP协议的流服务,IPPROTO_TCP的值为6
    ///printf("%d\n",IPPROTO_TCP);
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("socket初始化失败并返回错误代码: %d\n", WSAGetLastError());
        return -1;
    }
    ///输入服务器IP
    printf("Please input the server's IP:&#
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值