转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html      ——By Kevince

最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下:

head.h

 1 /*头文件,client和server编译时都需要使用*/
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 #include <sys/types.h>
 5 #include <sys/socket.h>
 6 #include <string.h>
 7 #include <pthread.h>
 8 #include <stdlib.h>
 9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11
12 #define MSGLEN 1000
13 #define IPLEN 15
14
15 typedef int SOCKET;

server.c:

 1 /*server*/
 2
 3 #include "head.h"
 4
 5 char msg_recv[MSGLEN], msg_send[MSGLEN];
 6 SOCKET server_sockfd, client_sockfd;
 7
 8 void *thread_function(void *argv) /*线程函数*/
 9 {
10     while(1){
11         gets(msg_send);
12         write(client_sockfd, msg_send, MSGLEN);
13     }
14     pthread_exit(NULL);
15 }
16
17 int main(int arg, char *argv[])
18 {
19     int server_len, client_len;
20     struct sockaddr_in server_address;
21     struct sockaddr_in client_address;
22     int port;
23     int res;
24
25     pthread_t a_thread;
26     void *thread_result;
27
28     if (arg != 2){
29         printf("server --portnum\n");
30         exit(EXIT_FAILURE);
31     }
32
33     sscanf(argv[1], "%d", &port); /*读入端口*/
34
35     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
36     server_address.sin_family = AF_INET;
37     server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
38     server_address.sin_port = htons(port);
39
40     server_len = sizeof(server_address);
41     bind(server_sockfd, (struct sockaddr *)&server_address, server_len); /*绑定端口并监听*/
42     listen(server_sockfd, 10);
43     printf("listen...\n");
44
45     client_len = sizeof(client_address);
46     client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
47     printf("connection success!\n");
48
49     res = pthread_create(&a_thread, NULL, thread_function, NULL); /*启动线程函数*/
50     if (res != 0){
51         perror("Thread creation failed");
52         exit(EXIT_FAILURE);
53     }
54
55     while(read(client_sockfd, msg_recv, MSGLEN)){
56         printf("msg from client: %s\n", msg_recv);
57     }
58     close(client_sockfd);
59     exit(EXIT_SUCCESS);
60 }

client.c:

 1 /*client*/
 2
 3 #include "head.h"
 4
 5 char msg_recv[MSGLEN],msg_send[MSGLEN];
 6 SOCKET sockfd;
 7
 8 void *thread_function(void *argv) /*线程函数*/
 9 {
10     while(1){
11         gets(msg_send);
12         write(sockfd, msg_send, MSGLEN);
13     }
14     pthread_exit(NULL);
15 }
16
17 int main(int arg, char *argv[])
18 {
19     struct sockaddr_in address;
20     int len;
21     int res;
22     int port;
23     char ip[IPLEN];
24
25     void *thread_result;
26     pthread_t a_thread;
27
28     sockfd = socket(AF_INET, SOCK_STREAM, 0);
29
30     if (arg != 3){
31         printf("client --ipaddress --portnum\n");
32         exit(EXIT_FAILURE);
33     }
34
35     sscanf(argv[1], "%s", ip);
36     sscanf(argv[2], "%d", &port); /*读取ip与端口*/
37
38     address.sin_family = AF_INET;
39     address.sin_addr.s_addr = inet_addr(ip);
40     address.sin_port = htons(port);
41
42     len = sizeof(address);
43     res = connect(sockfd, (struct sockaddr *)&address, len);
44     if (res == -1){
45         perror("connect failed! ");
46         exit(EXIT_FAILURE);
47     }
48     printf("connection success!\n");
49
50     res = pthread_create(&a_thread, NULL, thread_function, NULL); /*启动线程函数*/
51     if (res != 0){
52         perror("Thread creation failed");
53         exit(EXIT_FAILURE);
54     }
55
56     while(read(sockfd, msg_recv, MSGLEN)){
57         printf("msg from server: %s\n", msg_recv);
58     }
59     res = pthread_join(a_thread, &thread_result);
60     if (res != 0){
61         perror("joined failed");
62         exit(EXIT_FAILURE);
63     }
64     exit(EXIT_SUCCESS);
65 }

由于使用了线程,所以要链接正确的线程库,所以编译命令如下:

gcc -D_REENTRANT -I/usr/include/nptl server.c -o server -L/usr/lib/nptl -lpthreadgcc -D_REENTRANT -I/usr/include/nptl client.c -o client -L/usr/lib/nptl -lpthread

如果你的系统默认使用的就是NPTL线程库,那么编译时就无需加上-I和-L选项

运行时输入的命令规则是:

./server --portnum  #即server后面要加上需要绑定的端口号。./client --ip --portnum  #即client后面要加上服务器的IP地址以及端口号。

不积跬步无以至千里,虽然这两个程序很简单,但作为我的第一个linux环境下基于socket的通信程序,也很有纪念意义。

转载于:https://www.cnblogs.com/kevince/p/3891033.html

C语言 linux环境基于socket的简易即时通信程序相关推荐

  1. 基于P2P的局域网即时通信应用

    前言 这是一个使用java语言开发的基于P2P的局域网即时通信Android应用,界面是高仿微信的聊天界面,在里面你将会学到java多线程并发编程.Socket编程.UDP广播.TCP连接等. 项目地 ...

  2. Linux下基于TCP的简易文件传输(socket编程)

    Linux下基于TCP的简易文件传输(socket编程) OSI和TCP/IP: 关于TCP/IP协议 关于TCP协议 TCP编程的一般步骤[^2] TCP文件传输实现 功能概述 服务器编程 客户端编 ...

  3. python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  4. 基于Socket的简易聊天工具

    文章目录 基于Socket的简易聊天工具 简易聊天工具的功能: 项目设计 1.界面设计 2.类的设计 程序编写 1.ChatServer 2.ChatFrame 窗体的设计 1.ChatFrame的窗 ...

  5. Linux平台基于socket的文件传输服务器和客户端

    Linux平台基于socket的文件传输服务器和客户端 目录 前言 一.服务器程序结构 二.客户程序结构 三.代码 1.服务器主程序video_serv_fork.c 2.服务器子程序video_tr ...

  6. 【Java】GUI界面聊天小程序(基于Socket的客户端服务端通信)

    基于Socket的客户端服务端通信--Java GUI界面小程序 Socket概念及其通信过程: Socket是TCP/IP中的基本概念,它负责将TCP/IP包发送到指定的IP地址.也可以看成是在两个 ...

  7. python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例

    Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import sock ...

  8. Linux环境下编译并执行ava helloworld程序

    http://blog.lupaworld.com/home-space-uid-24466-do-blog-id-2578.html 已经学会怎样在Windows下怎样编辑,编译和运行Java程序了 ...

  9. 基于Socket的游戏服务器通信框架的设计与实现

    博客地址:blog.liujunliang.com.cn 开发工具:VS2017.Unity2017 本文介绍使用Socket/TCP来开发客户端与服务器端通信框架 博主使用过PhotonServer ...

最新文章

  1. 序列联配(alignment)和数据库搜索方法简介
  2. gradle使用技巧之全局变量
  3. java 内存泄漏 工具_Java剖析工具JProfiler入门使用教程:查找内存泄漏的方法
  4. mysql添加新用户 开放外网访问
  5. su、sudo、sudo su、sudo -i的用法和区别
  6. 最近关于编程学习的一点小体会
  7. Hive表中修改列位置,更改类型、移动位置(impala支不支持更改位置)
  8. 模拟退火算法之旅行商(TSP)问题matlab实现
  9. 20169219《linux内核原理与分析》第七周作业
  10. 用ntsd -c q -p PID 杀进程
  11. 16、static关键字、接口
  12. avr单片机c语言大小比较,AVR单片机C语言入门知识
  13. unity直播推流方式_干货,抖音无人直播技术(建议收藏)
  14. 地方科技局重点科技项目在线申报管理系统
  15. YOLOv6:又快又准的目标检测框架开源啦
  16. 爬取《悲伤逆流成河》猫眼信息 | 郭敬明五年电影最动人之作
  17. c++工具库大全(值得收藏)
  18. scrapy的分页(翻页处理)
  19. 安全测试涉及的测试对象有哪些?
  20. 数据流图详解(DFD)

热门文章

  1. 办公效率:从事会计行业,这些Excel技巧绝对用得着!
  2. 1 睡眠唤醒_一劳永逸解决WIN10所有睡眠问题
  3. 碎片化学前端,促进技术提升,我推荐这些
  4. 真诚推荐这7个大佬的公众号,碎片化学习
  5. Windows Mobile下使用CppUnitLite输出测试结果
  6. .net core高性能通讯开源组件BeetleX
  7. https://blog.csdn.net/cscscscsc/article/details/50
  8. CenterOS 7安装Nginx
  9. 老人寻求到一名程序员,用2W行代码给自己打造了一幅肖像画
  10. 对话Linus:Linux 25岁啦