一个多线程的Socket通信Demo(C语言实现)

-----------这是客户端程序--------------

#include "stdio.h"
#include "winsock2.h"
#include "stdlib.h"

#pragma comment(lib,"ws2_32")

void main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
    sockaddr_in sockaddr;
    sockaddr.sin_family = PF_INET;
    sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    sockaddr.sin_port = htons(9000);

    connect(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));

    char buffer[MAXBYTE] = {0};
    recv(s,buffer,MAXBYTE,NULL);
    printf(" ***SERVER*** %s",buffer);
    while(TRUE)
    {
        char* mymsg = new char[10000];
        printf(" OK Now You Can Connect .\n ->");
        gets(mymsg);
        send(s,mymsg,strlen(mymsg)+sizeof(char),NULL);
    }
    closesocket(s);
    WSACleanup();
    getchar();
    exit(0);
    
}

-----这是服务端程序------

#include "stdio.h"
#include "winsock2.h"
#include "stdlib.h"
#define MAXCLIENTS 2

#pragma comment(lib,"ws2_32")
/*
    多线程
            SOCKET
*/

DWORD WINAPI ProcessClientRequest(LPVOID lpParam)
{
    SOCKET* clientsocket = (SOCKET*)lpParam;
    char* msg = "Hello, Welcome to connect . \r\n";
    send(*clientsocket,msg,strlen(msg)+sizeof(char),NULL);
    printf("---SYS----    Hello @[email protected]\n");
    while(TRUE)
    {
        char buffer[MAXBYTE] = {0};
        recv(*clientsocket,buffer,MAXBYTE,NULL);
        if(strcmp(buffer,"exit")==0)
        {
            char* exit_msg = "Bye \r\n";
            send(*clientsocket,exit_msg,strlen(exit_msg)+sizeof(char),NULL);
            break;
        }
        printf("--- Sys: %s--\n",buffer);
    }
    closesocket(*clientsocket);
    return 0;
}

int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
    sockaddr_in sockaddr;
    sockaddr.sin_family = PF_INET;
    sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    sockaddr.sin_port = htons(9000);
    bind(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));
    listen(s,1);
    printf("listening on port[%d].\n",9000);
    char* msg = new char[1000];
    
    HANDLE threads[MAXCLIENTS];    //线程存放 数组
    int CountClient = 0;
    while(TRUE)
    {
        SOCKADDR clientAddr;
        int size = sizeof(SOCKADDR);
        SOCKET clientsocket;
        clientsocket = accept(s,&clientAddr,&size);        //阻塞模式 直到有新的Tcp 接入
        printf("Sys: New client touched ID is %d .\n",CountClient+1);            //
        if(CountClient < MAXCLIENTS)                        //创建新线程
        {
            threads[CountClient ++] = CreateThread(NULL,0,&ProcessClientRequest,&clientsocket,0,NULL);
        }
        else                                                //线程数超了 拒绝服务
        {
                char *msg = " Error Too many client Connecttion  !.\r\n";
                send(clientsocket,msg,strlen(msg)+sizeof(char),NULL);
                printf(" ** SYS **  REFUSED !.\n");
                closesocket(clientsocket);
        }
    }

    printf("Maximize clients occurred for d%.\r\n", MAXCLIENTS); 
    WaitForMultipleObjects(MAXCLIENTS,threads,TRUE,INFINITE);
    closesocket(s); //关闭socket

    for(int i=0;i<MAXCLIENTS;i++)
    {
        CloseHandle(threads[i]);
    }

    WSACleanup();
    getchar();
    exit(0);
    return 0;
}
时间: 2024-11-10 18:08:16

一个多线程的Socket通信Demo(C语言实现)的相关文章

一个简单的Socket通信Demo

都忘了哪里下的了,留个记录 服务器端Demo: Server.java(服务器端运行主程序,直接运行): package cn.wjs; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class Server { private static final int port = 9999; private static final int backlog = 100

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

ThinkPHP和Workerman整合实现Socket通信Demo(转载)

转自: https://www.jianshu.com/p/668ac301f9ca 因为最近有个项目涉及到Socket通信,于是自己尝试了一下搭建一个服务端WebSocket通信的项目,写个笔记,能帮助到你的话,十分荣幸.废话不多说进入正题: 先说下编者的运行环境 我是用 CentOS 6.5 ,PHP 5.6 首先要实现Socket通信要了解Socket的作用和用法(自行百度),然后就是需要你的服务器或者本地php环境支持并开启了Socket,一般集成环境都是支持的 phpinfo中如下图所

Android简单Socket通信demo

一.Android Socket 通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信

一个简单的socket通信小demo

写了一个socket的程序,可以和本地的服务器进行通信,要先和服务器建立链接,然后发送登录信息,验证成功,就可以和服务器通信了 1 页面截图 2 点击链接服务器,可以链接服务器,服务器的ip地址为:127.0.0.1 端口为 12345: 3 点击链接服务器之后,打印信息如下 4 点击登录,会向服务器发送登录信息: iam:zhangsan, 然后会客户端会显示登录成功 5 比如输入chongqingyoudian  6 在服务器控制台就能看到客户端发送的信息 客户端代码如下 1 // 2 //

Android---51---加入多线程进行Socket通信

前面服务器和客户端只是进行了简单的通信操作:服务器接收到客户端连接之后 服务器向客户端输出一个字符串,而客户端也只是读取服务器的字符串之后就退出了 而实际 应用中的客户端则可能需要和服务器保持长时间的通信,即服务器 需要不断的读取客户端的数据,并向客户端写入数据:客户端也需要不断的 读取服务器,并向数据库中写入数据. 使用传统BufferedReader的 readLine 方法读取数据时,当该方法成功返回之前,该线程 是阻塞的,程序无法继续进行.所以,服务器应该为每一个Socket开启一个线程

windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo

设置方法 int nNetTimeout=10000;//10秒,    //设置发送超时    setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));    //设置接收超时    setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 服务 1 #include <stdio.h&g

python基础-socket通信

socket是一种双向通信的起点和重点,氛围服务器端和客户端 Socket服务器端用到的方法有 Method Description s.bind() This method binds address (hostname, port number pair) to socket. s.listen() This method sets up and start TCP listener. s.accept() This passively accept TCP client connectio

Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)

Android基础入门教程--7.6.2 基于TCP协议的Socket通信(1) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Socket? 2.Socket通信模型: Socket通信