socket接口多线程数据传输

服务端代码

myserver.c

#include <sys/socket.h>
#include <sys/types.h>
#include <signal.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <arpa/inet.h>

#define PORT_NUM     5555
#define    MAX_CLIENT    100

typedef struct {
            int    index;
            int    using;        //using or not
            pthread_t tid;
            int client_com_fd;
            struct sockaddr_in client_addr;
            int     client_addr_len;
}mythread_arg_t;

mythread_arg_t    pthread_arg_array[MAX_CLIENT];

print_thread(int index)
{
    int    i = index;

    printf("=======================thread data=======================\n");
    printf("pthread_arg_array[i].index = %d\n", pthread_arg_array[i].index);
    printf("pthread_arg_array[i].using = %d\n", pthread_arg_array[i].using);
    printf("pthread_arg_array[i].tid = 0x%lx\n", pthread_arg_array[i].tid);
    printf("pthread_arg_array[i].client_com_fd = %d\n", pthread_arg_array[i].client_com_fd);
    printf("pthread_arg_array[i].client_addr = %s\n", inet_ntoa(pthread_arg_array[i].client_addr.sin_addr));
    printf("=======================thread end========================\n");
}

void *do_client( void *arg)
{
    char buf[1400];

    int i = (int)(long)arg;
    while(1)
    {
        int ret = recv(pthread_arg_array[i].client_com_fd, buf, sizeof(buf), 0);
        if(ret == -1 || ret == 0)
        {
            perror("recv");
            break;
        }

        if(!strncmp(buf, "exit", 4))
        {
            break;
        }

        printf("recv from client address: %s data: %s\n", inet_ntoa(pthread_arg_array[i].client_addr.sin_addr), buf);

    }
    print_thread(i);

    close(pthread_arg_array[i].client_com_fd);
    pthread_arg_array[i].using = 0;
}

void client_exit(int signo)
{
    pid_t pid;

    pid = wait( NULL );
    //close( listen_fd );
    printf("pid = %d exit.\n", pid );
}

int main( int argc, char ** argv )
{
    int listen_fd = socket( AF_INET, SOCK_STREAM, 0 );    

    struct sockaddr_in myaddr;
    myaddr.sin_family = AF_INET;
    myaddr.sin_port = htons(PORT_NUM);
    myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    int ret;
    int    i;

    signal(SIGCHLD, client_exit);

    ret = bind(listen_fd, (struct sockaddr *)&myaddr, sizeof(struct sockaddr));
    if(-1 == ret)
    {
        perror("bind");
        exit(1);
    }

    listen(listen_fd, 20);

    struct sockaddr_in client_addr;
    int client_addr_len = sizeof(struct sockaddr);
    int client_com_fd;

    while(1)
    {
        //find an no using entry
        for(i = 0; (i < MAX_CLIENT)&&(1 == pthread_arg_array[i].using); i++)
            ;
        if(i >= MAX_CLIENT)
        {
            printf("overload!\n");
            close(client_com_fd);
            continue;
        }

        printf("i = %d\n", i );

        client_com_fd = accept(listen_fd,(struct sockaddr *)&client_addr, &client_addr_len);
        pthread_arg_array[i].using = 1;
        printf("ip address %s have send connect request.\n", inet_ntoa(client_addr.sin_addr));

        pthread_arg_array[i].index = i;
        pthread_arg_array[i].client_com_fd = client_com_fd;
        pthread_arg_array[i].client_addr = client_addr;
        pthread_arg_array[i].client_addr_len = client_addr_len;

        pthread_t *ptid = &(pthread_arg_array[i].tid);

        if(-1 == pthread_create(ptid, NULL, do_client, (void *)(long)i))
        {
            printf("pthread_creat()\n");
            continue;
        }

/*
        pid_t pid;
        pid = fork();
        if( pid < 0 ) {
            perror("fork");
            exit( 3 );
        } else if( pid == 0 ) {
            close( listen_fd );
            do_client( client_com_fd, client_addr );
            close( client_com_fd );
            exit( 0 );
        }
*/
    }

    //close( client_com_fd );
    //close( listen_fd );
}

客户端代码

myclient.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

#define PORT_NUM     5555
#define LENGTH  1460

int main(int argc, char *argv[])
{
    if(2 != argc) {
        exit(1);
    }

    int sock_fd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT_NUM);
    server_addr.sin_addr.s_addr = inet_addr(argv[1]);

    int ret = connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
    if(-1 == ret) {
        perror("connect");
        exit(2);
    }

    char buf[LENGTH];

    while(1) {
        printf("Input str: ");
        //gets(buf);
        fgets(buf, LENGTH, stdin);
        send(sock_fd, buf, strlen(buf)+1, 0);
        if(!strncmp(buf, "exit", 4))
        {
            break;
        }
    }

    close(sock_fd);
}

编译链接执行: 先启动服务端, 然后在其它终端启动客户端. 执行结果如下:

时间: 2024-11-05 15:44:56

socket接口多线程数据传输的相关文章

socket接口

通过socket接口传输数据 例1: udp协议的socket传输数据 recv.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #include <unistd.h> /* *receive data as &q

Socket接口是TCP/IP网络的API-C语言版

Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口.  Socket接口设计者最先是将接口放在Unix操作系统里面的.如果了解Unix系统的输入和输出的话,就很容易了解Socket了.网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整

【1】HTTP协议和Socket接口区别

内容提要: 1.网络七层模型 2.什么是HTTP协议 3.什么是Socket接口 1.网络七层模型 第一层:物理层 为设备之间的信息提供传输提供可靠环境,那么这个环境是什么呢? 如:同轴电缆,插头,接收器,水晶头,网线等.可以在通信的两个数据终端的设备之间连接起来形成一条通路. 再说下这个协议中的某一项规定:比如eiars-232-c及rs-449就可以兼容于100序列线上. 第二层:数据链路层 提供数据的传送服务.这里涉及到一个信息就是帧,它是数据传输的单元,不同的协议帧的长短也不同.它还有差

linux网络socket 接口转

linux网络socket 接口 1.socket函数:一个进程必须做的第一件事就是调用socket函数获得一个文件描述符. ----------------------------------------------------------------- #include<sys/socket.h> int socket(int family,int type,int protocol); 返回:非负描述字---成功 -1---失败 -----------------------------

Java语言Socket接口用法详解

Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求. 扩展: ServerSocket中常用的构造函数及方法 构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

Java中socket接口调用

最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方.在贴代码之前,还是要了解一下关于socket的基础知识. Socket的基本概念 1.建立连接 当需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序这对其发出连接请求.这一点同电话系统类似--必须有一方拨打电话,而另一方必须等候电话连通. 建立连接的过程为: (1)先在服务器端生成一个ServerSocket实例对象,随时监听客户端的连接请求. (2)当客户端需

探究python与linux的socket接口间的关系

1. 实验环境 Ubuntu 16.04LTS 2. 利用python的socket接口实现一个简单的聊天小程序 server端 import socket server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) server.bind(('127.0.0.1',8083)) server.listen(5) print

你好,博客园!!第一弹~局域网下的简易聊天室,socket与多线程简结

发觉博客园里面关于这些基本知识点的详细内容真是应有尽有,所以这里的随笔就不再重复了,就积累一下简单的用法-- 1.Socket 最近学网络编程,也就是Socket,套接字,一个用来建立链接传输数据的工具. 数据传输发生在"客户端"与"服务端"之间,下面是一种建立连接传输数据的简单方法: (1)客户端 1 try{ 2 //服务端ip 3 String ip = "127.0.0.1"; 4 //服务器端口 5 int port = 5000; 6

Python socket进阶 多线程/进程

xSocket语法及相关 Socket Families(地址簇) socket.AF_UNIX unix本机进程间通信  socket.AF_INET IPV4 socket.AF_INET6  IPV6 上面的这些内容代表地址簇,创建socket必须指定,默认为IPV4 Socket Types socket.SOCK_STREAM  #for tcp socket.SOCK_DGRAM   #for udp  socket.SOCK_RAW     #原始套接字,普通的套接字无法处理ICM