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    100typedef 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 entryfor(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  1460int 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);
}

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

转载于:https://www.cnblogs.com/zhanglong71/p/5152280.html

socket接口多线程数据传输相关推荐

  1. linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...

    陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...

  2. 计算机网络:Socket网络通信底层数据传输

    1. 前言 最近在研究RDMA的实时流处理系统,其中需要比较RDMA高速网络通信和传统Socket网络通信的传输特点进行比较.所以我们就来总结游戏传统Scoket网络通信的特点,对于一个程序开发人员来 ...

  3. socket接口详解

    socket接口详解 socket概述 接口详解 socket() bind() listen() accept() connect() send() recv() sendto() recvfrom ...

  4. 详解Socket接口

    要学Internet上的TCP/IP网络编程,必须深刻理解Socket接口.之所以另起一篇文章来讨论Socket,是因为它是网络通信架构的基础,重要性不言而喻.所谓socket通常也称作"套 ...

  5. Socket接口原理及用C#语言实现

    首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...

  6. Java接口多线程并发测试 (一)

    本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...

  7. java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法

    很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接 ...

  8. Java 网络实例二(查看主机指定文件的最后修改时间、Socket实现多线程服务器程序、Socket连接到指定主机、网页抓取)

    查看主机指定文件的最后修改时间 import java.net.URL; import java.net.URLConnection; import java.util.Date; import ja ...

  9. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

  10. Linux Socket接口使用方法

    Linux内核net/socket.c定义了一套socket的操作api.图1展示了socket层所处与TCP/IP协议栈之上和应用层之下. socket()函数 socket函数对应于普通文件的打开 ...

最新文章

  1. NC:MetaSort通过降低微生物群落复杂度以突破宏基因组组装难题
  2. python3 的乐趣进度条
  3. C#中的运算符、数组、枚举、结构体
  4. pSort CodeForces - 28B(并查集)
  5. P1494-[国家集训队]小Z的袜子【分块优化莫队】
  6. [vue] 如何实现一个虚拟DOM?说说你的思路
  7. 分数怎么在计算机上关,电脑如何在注册表上关闭AutoRun功能
  8. 前端:后端,我要分手,你不适合我
  9. Ubuntu下跑通py-faster-rcnn、详解demo运作流程
  10. eclipse javaWeb项目如何引入jar包
  11. 解决报错 Initialize failed: invalid dom.
  12. IEEE的论文哪里可以下载?
  13. ArcGIS模型构建器计算几何的方法
  14. java学习笔记----Mybatis-Plus
  15. python模型保存与恢复_tensorflow1.0学习之模型的保存与恢复(Saver)
  16. 电商数据分析——基于hive数仓,实现大数据分析
  17. 海豚湾(还是忍不住说日本人真的太垃圾了)
  18. CF19E Fairy (奇偶环,树上差分)
  19. pandas数据处理:常用却不甚了解的函数,pd.read_excel()
  20. 线段树合并(四道例题)

热门文章

  1. 数据结构与算法之图入门
  2. SqlServer批量更新两关联表的数据
  3. Springcloud实战(五)微服务网关
  4. html图片透明度变化,css,_CSS3动画实现图片透明度变化在微信上无效的解决方案,css - phpStudy...
  5. Scrapy 发起post请求
  6. vba 自动排序_Excel表格自动排序,神了!
  7. Python实现笑脸检测+人脸口罩检测
  8. linux c 语言编程如何把串口字符串数据写到txt文件中_C 语言简单编程速成 | Linux 中国...
  9. arduino串口监视器显示nan_Arduino常用的三种通信协议UART, I2C和SPI
  10. C#:遍历JObject