资源简介

这个程序是在window下用c编写的socket基于多线程的程序,程序能够完美运行,并且程序注解也是很清楚的哦!Liunx版本的c编写的socket多线程的聊天室也是有的,程序中有可直接执行的exe文件方便大家测试。

资源截图

代码片段和文件信息

//加载头文件

#include 
#include 
#include 
#pragma comment(lib“ws2_32.lib“)
#include 
//定义一些常量
    #define PORT 8585   
//输入输出的一些内容的字符长度
#define MAX_SIZE 1000   
SOCKET fd;//客户端fd
//发送和接受的信息 
    char sendbuf[1024];
    char recvbuf[1024];

   SOCKET create_connection(){
//创建socket AF_INET是ipv4d 
SOCKET socket_cliet = socket(AF_INET SOCK_STREAM IPPROTO_TCP);
//判断是否可以创建socket 
if(socket == INVALID_SOCKET){
printf(“socket_cliet 创建失败 \n“);
exit(1);//错误退出
}
//构造一个客户端的地址
struct sockaddr_in client;  

//ipv4的地址
client.sin_family = AF_INET; 
client.sin_addr.s_addr =inet_addr(“192.168.43.158“); 
client.sin_port = htons(PORT); 
//进行连接
if(connect(socket_cliet (struct sockaddr *)&clientsizeof(struct sockaddr)) == SOCKET_ERROR){  
printf(“客户端连接失败,未找到服务器,请确保服务器先开启\n“); 
//关闭socket 
closesocket(socket_cliet);
//退出程序 
exit(1); 
}  
   
   return socket_cliet;
   }
   //这是一个线程处理的函数,用来接受服务器传来的信息
    void recvinfo(void* ptr)
    { 
while(1)
{
//对信息进行处理清空 可以接受下一个内容
if ((recv(fdrecvbufMAX_SIZE0))==-1){ 
printf(“服务器故障5555555555555555 已退出客户端\n“); 
exit(1); 
}
//打印出该结束的信息
printf(“%s“recvbuf);
//清空缓存 
memset(recvbuf0sizeof(recvbuf));
    }
   }

    int main() 
    { 
    

    //开启socket服务的函数 
    WORD sockVersion = MAKEWORD(2 2);
WSADATA data;
if (WSAStartup(sockVersion &data)!= 0)
{
return 0;
}
    //进入的时候携带用户名昵称 默认为null 

//得到客户端连接的socket
    fd=create_connection();
    //输入name
   char *name=““; 
   printf(“亲爱的用户名请输入你的聊天室的姓名哦!\n“);
scanf(“%s“&name);
printf(“\n“); 
//正式进入聊天室 进入了之后的话就进行对服务器的连接完成了
    printf(“--------》亲爱的客户:%s 你已经成功进入聊天室《--------\n“&name);
    
    //接下来的操作就是 客户端与服务器之间传输数据与接受数据 
//这里要使用一个非堵塞的io
//send信息和recv信息都是与服务器之间进行通信的,他们都是同步的函数
//都是堵塞的函数,如果用if来判断,就直接获得返回值也是可以,但是没有实现出来
//然后就使用一个线程一直来接收信息,主线程也是main的线程就一直来发送信息
   
//这个recvinfo是接受服务器的信息
    _beginthread(recvinfo0NULL);
//这下是发送信息
    while(1)
    
    { //发送之前清空内容
        memset(sendbuf0sizeof(sendbuf));
//先把姓名输入到这个集合中。
char sendname[1222];
        memset(sendname0sizeof(sendname));
char *you=“  say:“;
strcat (sendname&name);
strcat (sendnameyou);
//stdin是标准终端输入 fgets函数是显示在终端上并且内容存入sendbuf中
//fflush(stdin);a
        //s(sendbufsizeof(sendbuf)stdin);
        scanf(“%s“&sendbuf);
        strcat(sendnamesendbuf);
        //memset(sendname0sizeof(sendname));
        send(fdsendnamesizeof(sendname)0);
        memset(sendbuf0sizeof(sendbuf));
    }
    closesocket(fd);
WSACleanup();
return 0;
 }

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-12-01 17:19  c的socket服务器\
     文件        3142  2018-12-01 17:19  c的socket服务器\c.c
     文件      136256  2018-12-01 17:19  c的socket服务器\c.exe
     文件        3795  2018-12-01 11:58  c的socket服务器\s.c
     文件      136238  2018-12-01 12:29  c的socket服务器\s.exe

评论

共有 条评论