pthreat socket

three file in one directory

  • config.h
  • server.c
  • client.c

config.h

/*
 * config.h 包含该tcp/ip套接字编程所需要的基本头文件,与server.c client.c位于同
一目录下
*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <pthread.h>const int MAX_LINE = 2048;
const int PORT = 6001;
const int BACKLOG = 10;
const int LISTENQ = 6666;
const int MAX_CONNECT = 20;

server.c

/*
*  服务器端代码实现
*/#include "config.h"/*处理接收客户端消息函数*/
void *recv_message(void *fd)
{int sockfd = *(int *)fd;while(1){char buf[MAX_LINE];memset(buf , 0 , MAX_LINE);int n;if((n = recv(sockfd , buf , MAX_LINE , 0)) == -1){perror("recv error.\n");exit(1);}//ifbuf[n] = '\0';        //若收到的是exit字符,则代表退出通信if(strcmp(buf , "byebye.") == 0){printf("Client closed.\n");close(sockfd);exit(1);}//ifprintf("\nClient: %s\n", buf);}//while
}int main()
{//声明套接字int listenfd , connfd;socklen_t clilen;//声明线程IDpthread_t recv_tid , send_tid;//定义地址结构struct sockaddr_in servaddr , cliaddr;/*(1) 创建套接字*/if((listenfd = socket(AF_INET , SOCK_STREAM , 0)) == -1){perror("socket error.\n");exit(1);}//if/*(2) 初始化地址结构*/bzero(&servaddr , sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(PORT);/*(3) 绑定套接字和端口*/if(bind(listenfd , (struct sockaddr *)&servaddr , sizeof(servaddr)) < 0){perror("bind error.\n");exit(1);}//if/*(4) 监听*/if(listen(listenfd , LISTENQ) < 0){perror("listen error.\n");exit(1);}//if/*(5) 接受客户请求,并创建线程处理*/clilen = sizeof(cliaddr);if((connfd = accept(listenfd , (struct sockaddr *)&cliaddr , &clilen)) < 0){perror("accept error.\n");exit(1);}//ifprintf("server: got connection from %s\n", inet_ntoa(cliaddr.sin_addr));/*创建子线程处理该客户链接接收消息*/if(pthread_create(&recv_tid , NULL , recv_message, &connfd) == -1){perror("pthread create error.\n");exit(1);}//if/*处理服务器发送消息*/char msg[MAX_LINE];memset(msg , 0 , MAX_LINE);while(fgets(msg , MAX_LINE , stdin) != NULL)  {   if(strcmp(msg , "exit\n") == 0){printf("byebye.\n");memset(msg , 0 , MAX_LINE);strcpy(msg , "byebye.");send(connfd , msg , strlen(msg) , 0);close(connfd);exit(0);}//ifif(send(connfd , msg , strlen(msg) , 0) == -1){perror("send error.\n");exit(1);}//if     }//while
}

client.c

/*
* 客户端代码
*/
#include "config.h"/*处理接收服务器消息函数*/
void *recv_message(void *fd)
{int sockfd = *(int *)fd;while(1){char buf[MAX_LINE];memset(buf , 0 , MAX_LINE);int n;if((n = recv(sockfd , buf , MAX_LINE , 0)) == -1){perror("recv error.\n");exit(1);}//ifbuf[n] = '\0';//若收到的是exit字符,则代表退出通信if(strcmp(buf , "byebye.") == 0){printf("Server is closed.\n");close(sockfd);exit(0);}//ifprintf("\nServer: %s\n", buf);}//while
}int main(int argc , char **argv)
{/*声明套接字和链接服务器地址*/int sockfd;pthread_t recv_tid , send_tid;struct sockaddr_in servaddr;/*判断是否为合法输入*/if(argc != 2){perror("usage:tcpcli <IPaddress>");exit(1);}//if/*(1) 创建套接字*/if((sockfd = socket(AF_INET , SOCK_STREAM , 0)) == -1){perror("socket error");exit(1);}//if/*(2) 设置链接服务器地址结构*/bzero(&servaddr , sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);if(inet_pton(AF_INET , argv[1] , &servaddr.sin_addr) < 0){printf("inet_pton error for %s\n",argv[1]);exit(1);}//if/*(3) 发送链接服务器请求*/if( connect(sockfd , (struct sockaddr *)&servaddr , sizeof(servaddr)) < 0){perror("connect error");exit(1);}//if    /*创建子线程处理该客户链接接收消息*/if(pthread_create(&recv_tid , NULL , recv_message, &sockfd) == -1){perror("pthread create error.\n");exit(1);}//if  /*处理客户端发送消息*/char msg[MAX_LINE];memset(msg , 0 , MAX_LINE);while(fgets(msg , MAX_LINE , stdin) != NULL)    {if(strcmp(msg , "exit\n") == 0){printf("byebye.\n");memset(msg , 0 , MAX_LINE);strcpy(msg , "byebye.");send(sockfd , msg , strlen(msg) , 0);close(sockfd);exit(0);}//ifif(send(sockfd , msg , strlen(msg) , 0) == -1){perror("send error.\n");exit(1);}//if}//while
}

complied

$ gcc server.c -o server -pthread
$ gcc client.c -o client -pthread

run

$ ./server &
$ ./client 127.0.0.1

Linux Socket C语言网络编程:Pthread Socket [code from GitHub, for study]相关推荐

  1. Linux C++服务器项目——网络编程1 (socket通信,服务端,客户端)

    牛客 C++高并发服务器开发 参考笔记 1.MAC地址 2 IP地址 2.1 简介 2.2 IP地址编址方式 2.3 子网掩码 3 端口 3.1 简介 3.2 端口类型 4 网络模型 4.1 OSI七 ...

  2. Linux Socket C语言网络编程:TCP Socket

    TCP/IP Socket套接字C语言编程 源代码尽供学习交流 头文件cnofig.h /* * config.h 包含该tcp/ip套接字编程所需要的基本头文件,与server.c client.c ...

  3. Linux Socket C语言网络编程:SCTP Socket

    Table of Contents SCTP介绍 SCTP(流控制传输协议) SCTP服务 SCTP封包格式 SCTP,TCP和UDP的比较 拥塞 开环拥塞控制 闭环拥塞控制 SCTP协议的各个功能如 ...

  4. Linux Socket C语言网络编程:Select Socket

    Select Socket 你需要包含#include <sys/select.h> 结果 $ ./server & $ ./client 127.0.0.1accpet conn ...

  5. Linux Socket C语言网络编程:UDP Socket

    UDP简介 UDP与TCP相比,UDP是没有链接的协议,可以把他比作电子邮件,收信方不需要确认就可以接收邮件(不需要握手),这一点以TCP协议不同. 下面简单介绍GitHub上的开源项目TCP-Soc ...

  6. C语言网络编程:socket函数

    函数描述 头文件 <sys/types.h> <sys/socket.h> 函数使用int socket(int domain, int type, int protocol) ...

  7. Linux操作系统C语言网络编程学生在线考试系统(带完整项目源码)

    目录 一.项目功能 1.用户登录 2.教师登录 3.学生登录 二.需求分析 1.多用户登录,有并发需求. 2.需要数据库存储一堆信息. 三.软硬件开发平台 1.硬件 2.软件 四.技术点 1.使用并发 ...

  8. C++笔记--Linux网络编程(15-0)-socket(供自查,文档说明)

    目录 网络基础 协议的概念 什么是协议 典型协议 网络应用程序设计模式 C/S模式 B/S模式 优缺点 分层模型 OSI七层模型 TCP/IP四层模型 通信过程 协议格式 数据包封装 以太网帧格式 A ...

  9. Java网络编程:socket与Netty

    Java网络编程:socket与Netty Java网络编程:socket与Netty TCP/IP介绍 简介 数据传输 TCP粘包和黏包 现象 为什么出现 如何解决 Socket介绍 介绍 功能开发 ...

最新文章

  1. 0510JS基础:定义、输出、变量
  2. 第二十二章 SHELL脚本-CENTOS7.5知识
  3. pytorch注意事项
  4. 9月26日数聚云端·智驭未来「阿里云数据库创新上云峰会」邀你进入数智未来
  5. Jquery日历编写小练习
  6. python和stata_从Python运行Stata do文件
  7. 高效程序员应该养成的七个习惯
  8. 双11又来了,网友:比数学考试都难
  9. java例程练习(多线程[线程同步问题])
  10. 偶然搜索看到的杂谈——什麼東西是.NET程序員可以掌握並且可倚仗十年而不管微軟存在與否的技術呢?...
  11. mysql 子查询代替_MySQL查询优化:用子查询代替非主键连接查询
  12. 千万主播薇娅们直播间用的直播六个话术
  13. 《程序员的自我修养---链接、装载与库》读书笔记(一)计算机组成原理与操作系统
  14. 如何在vue3.0项目中集成Element-plus
  15. 理财笔记 - 给朋友的建议
  16. linux cpu数理,Linux中的 德·摩根定律
  17. 使用nodejs + wecharty打造你的个人微信机器人
  18. 云主机是什么?可以用来干嘛?
  19. L298N双路驱动直流电机方案(支持PWM+正反转)
  20. 郭炜-C语言程序设计-程序设计与算法(一)-第三周

热门文章

  1. Java开发人员常用网站收录
  2. 2019.7.24循环结构以及昨天的预习题。
  3. swift版 二分查找 (折半查找)
  4. ovs加dpdk出现EAL No free hugepages reported in hugepages-1048576kB
  5. 【原】PSD图标素材的全自动切图方法,适用于IOS、安卓、web前端等领域
  6. Tomcat 添加为系统服务 开机自动启动
  7. poj 1056 IMMEDIATE DECODABILITY
  8. 常用的JavaScript验证正则表达式
  9. 显示用户上次访问时间
  10. 题目管理后台系统_中后台产品最爱的后台:CMS(社区)管理系统搭建